2009-08-17 9 views
26

बनाम तो मैं यह देखने के लिए बहु मॉड्यूल cpu बाध्य काम सूत्रण की तुलना में बड़े पैमाने हैं कुछ परीक्षण कोड खटखटाया।अजगर बहु ​​खिड़कियों पर cpu बाध्य काम के लिए सूत्रण और linux

osx (dual core macbook pro) 
serialrun took 2026.995 ms 
parallelrun took 1288.723 ms 
threadedrun took 5314.822 ms 

मैं तो चला गया और एक विंडोज़ मशीन पर यह कोशिश की और कुछ मिल गया:

linux (dual quad core xeon): 
serialrun took 1192.319 ms 
parallelrun took 346.727 ms 
threadedrun took 2108.172 ms 

मेरे डुअल कोर मैकबुक प्रो समान व्यवहार दिखाता है: लिनक्स पर मैं प्रदर्शन वृद्धि है कि मैं उम्मीद थी मिल बहुत अलग परिणाम।

windows (i7 920): 
serialrun took 1043.000 ms 
parallelrun took 3237.000 ms 
threadedrun took 2343.000 ms

क्यों ओह क्यों, बहु दृष्टिकोण इतना खिड़कियों पर धीमी है?

यहाँ परीक्षण कोड है:

#!/usr/bin/env python 

import multiprocessing 
import threading 
import time 

def print_timing(func): 
    def wrapper(*arg): 
     t1 = time.time() 
     res = func(*arg) 
     t2 = time.time() 
     print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0) 
     return res 
    return wrapper 


def counter(): 
    for i in xrange(1000000): 
     pass 

@print_timing 
def serialrun(x): 
    for i in xrange(x): 
     counter() 

@print_timing 
def parallelrun(x): 
    proclist = [] 
    for i in xrange(x): 
     p = multiprocessing.Process(target=counter) 
     proclist.append(p) 
     p.start() 

    for i in proclist: 
     i.join() 

@print_timing 
def threadedrun(x): 
    threadlist = [] 
    for i in xrange(x): 
     t = threading.Thread(target=counter) 
     threadlist.append(t) 
     t.start() 

    for i in threadlist: 
     i.join() 

def main(): 
    serialrun(50) 
    parallelrun(50) 
    threadedrun(50) 

if __name__ == '__main__': 
    main()
+2

मैं एक क्वाड-कोर डेल PowerEdge 840 Win2k3 चलाने पर अपने परीक्षण कोड भाग गया है, और परिणाम तुम्हारा के रूप में के रूप में नाटकीय नहीं थे, लेकिन अपनी बात मान्य रहता है: serialrun ले लिया 1266.000 एमएस parallelrun 1906.000 एमएस threadedrun 4359.000 ले लिया ले लिया एमएस मुझे यह देखने में दिलचस्पी होगी कि आपको क्या जवाब मिलते हैं। मैं खुद को नहीं जानता। – Jeff

उत्तर

15

यूनिक्स संस्करणों के तहत प्रक्रियाएं अधिक हल्के हैं। विंडोज़ प्रक्रियाएं भारी हैं और शुरू करने के लिए और अधिक समय लेती हैं। खिड़कियों पर मल्टीप्रोसेसिंग करने का अनुशंसित तरीका थ्रेड हैं।

+0

ओह दिलचस्प, तो इसका मतलब यह होगा कि परीक्षण के संतुलन में परिवर्तन, उच्च गिनती का कहना है, लेकिन कम समय, विंडोज कुछ मल्टीप्रोसेसिंग प्रदर्शन को पुनः प्राप्त करने देगा? मैं इसे जाने दूंगा। – manghole

+1

ने 10.000.000 और 8 पुनरावृत्तियों की गणना करने के लिए पुनरावृत्ति की कोशिश की और परिणाम विंडोज़ के पक्ष में अधिक हैं:

serialrun took 1651.000 ms parallelrun took 696.000 ms threadedrun took 3665.000 ms
manghole

4

यह कहा गया है कि विंडोज पर प्रक्रियाओं बनाने लिनक्स पर से ज्यादा महंगा है। यदि आप साइट के चारों ओर खोज करते हैं तो आपको कुछ जानकारी मिल जाएगी। यहां one है जो मुझे आसानी से मिला है।

24

python documentation for multiprocessing Windows में समस्याओं के लिए os.fork() की कमी को दोषी मानते हैं। यह यहां लागू हो सकता है।

देखें कि जब आप psyco आयात करते हैं तो क्या होता है। सबसे पहले, यह easy_install:

C:\Users\hughdbrown>\Python26\scripts\easy_install.exe psyco 
Searching for psyco 
Best match: psyco 1.6 
Adding psyco 1.6 to easy-install.pth file 

Using c:\python26\lib\site-packages 
Processing dependencies for psyco 
Finished processing dependencies for psyco 

अपने अजगर स्क्रिप्ट के शीर्ष करने के लिए इस जोड़ें:

:

serialrun took 1191.000 ms 
parallelrun took 3738.000 ms 
threadedrun took 2728.000 ms 

मैं के साथ ये परिणाम प्राप्त:

import psyco 
psyco.full() 

मैं बिना इन परिणामों

serialrun took 43.000 ms 
parallelrun took 3650.000 ms 
threadedrun took 265.000 ms 

समानांतर अभी भी धीमा है, लेकिन अन्य रबड़ जलाते हैं।

संपादित करें: भी, इसे मल्टीप्रोसेसिंग पूल के साथ आज़माएं। (यह मेरा पहला यह कोशिश कर रहा है और यह इतनी तेजी से है, मैं समझ मैं कुछ याद आ रही किया जाना चाहिए।)

@print_timing 
def parallelpoolrun(reps): 
    pool = multiprocessing.Pool(processes=4) 
    result = pool.apply_async(counter, (reps,)) 

परिणाम:

C:\Users\hughdbrown\Documents\python\StackOverflow>python 1289813.py 
serialrun took 57.000 ms 
parallelrun took 3716.000 ms 
parallelpoolrun took 128.000 ms 
threadedrun took 58.000 ms 
+0

अच्छा अनुकूलन के लिए +1। –

+0

बहुत साफ! गिनती-मूल्य को बढ़ाने के दौरान पुनरावृत्तियों (प्रक्रियाओं) की संख्या को कम करने से पता चलता है कि, जैसा कि बायरन ने कहा था कि पैरारलल स्लोनेस विंडोज प्रक्रियाओं के अतिरिक्त सेटअप समय से आता है। – manghole

+0

पूल अपने आप को पूरा करने के लिए इंतजार नहीं कर रहा है, पूल के लिए एक जॉइन() विधि है लेकिन ऐसा लगता है कि मुझे ऐसा नहीं लगता है: पी। – manghole

1

वर्तमान में, अपने काउंटर() फ़ंक्शन ज्यादा संशोधित नहीं किया गया है राज्य। काउंटर() को बदलने का प्रयास करें ताकि यह स्मृति के कई पृष्ठों को संशोधित कर सके। फिर एक सीपीयू बाध्य पाश चलाओ। देखें कि लिनक्स और खिड़कियों के बीच अभी भी बड़ी असमानता है या नहीं।

मैं अभी पाइथन 2.6 नहीं चला रहा हूं, इसलिए मैं इसे स्वयं नहीं कर सकता।

1

बस पूल शुरू करने में काफी समय लगता है। मैंने 'असली दुनिया' कार्यक्रमों में पाया है यदि मैं एक पूल खोल सकता हूं और इसे कई अलग-अलग प्रक्रियाओं के लिए पुन: उपयोग कर सकता हूं, विधि कॉल के माध्यम से संदर्भ पारित कर सकता हूं (आमतौर पर मानचित्र का उपयोग कर।async) तो लिनक्स पर मैं कुछ प्रतिशत बचा सकता हूं लेकिन विंडोज़ पर मैं अक्सर समय निकाल सकता हूं। लिनक्स हमेशा मेरी विशेष समस्याओं के लिए तेज़ है लेकिन विंडोज़ पर भी मुझे मल्टीप्रोसेसिंग से शुद्ध लाभ मिलता है।

संबंधित मुद्दे