2016-08-05 7 views
6

के खूबसूरत दुनिया से आ रहा है, मैं इस व्यवहार को समझने की कोशिश कर रहा हूँ:क्या निरंतर परिणाम के साथ फ़ंक्शन कॉल को प्रतिस्थापित करने के लिए पर्याप्त पाइथन स्मार्ट है?

In [1]: dataset = sqlContext.read.parquet('indir') 
In [2]: sizes = dataset.mapPartitions(lambda x: [len(list(x))]).collect() 
In [3]: for item in sizes: 
    ...:  if(item == min(sizes)): 
    ...:   count = count + 1 
    ...:   

नहीं भी 20 मिनट के बाद समाप्त होता है, और मुझे पता है कि सूची sizes कि बड़े, से कम नहीं है लंबाई में 205k। हालांकि इस तुरन्त मार डाला:

In [8]: min_item = min(sizes) 

In [9]: for item in sizes: 
    if(item == min_item): 
     count = count + 1 
    ...:   

तो क्या हुआ?

मेरा अनुमान है: नहीं समझ सकता है कि min(sizes) हमेशा स्थिर हो जाएगा, इस प्रकार अपनी वापसी value..since अजगर दुभाषिया का उपयोग करता है के साथ पहले कुछ कॉल के बाद की जगह ..


min() नहीं करता है के रेफरी कुछ भी नहीं कहें जो मुझे इस मामले को समझाएगा, लेकिन मैं जो सोच रहा था वह यह हो सकता है कि इसे करने के लिए विभाजन को देखने की आवश्यकता हो, लेकिन यह मामला नहीं होना चाहिए, क्योंकि sizeslist है , नहीं 0!


संपादित करें:

यहाँ मेरी भ्रम का स्रोत है, मैं सी में एक समान कार्यक्रम ने लिखा है:

for(i = 0; i < SIZE; ++i) 
    if(i == mymin(array, SIZE)) 
     ++count; 

और इन समय मिल गया:

C02QT2UBFVH6-lm:~ gsamaras$ gcc -Wall main.c 
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out 
That took 98.679177000 seconds wall clock time. 
C02QT2UBFVH6-lm:~ gsamaras$ gcc -O3 -Wall main.c 
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out 
That took 0.000000000 seconds wall clock time. 

और समय के लिए, मैंने अपने Time measurements से नामांकित पशु का दृष्टिकोण उपयोग किया।

+1

पहला कोड 'ओ (एन * एन)' है, दूसरा कोड 'ओ (एन) 'है। यह परिकल्पना का समर्थन कैसे करता है? – user2864740

+1

सीपीथन केवल वास्तव में सरल अनुकूलन करता है। भाषा की गतिशील प्रकृति भी कई अनुकूलन असंभव बनाती है: उदाहरण के लिए, कल्पना करें कि क्या कुछ अन्य कोड 'min = lambda x: 1' किया गया है। –

+3

कोई गैर-शुद्ध भाषा नहीं है जिसे मैं जानता हूं कि यह अनुकूलन "समझने" की भी कोशिश करेगा। इसके लिए वैध होने के लिए निर्धारक व्यवहार की गारंटी की आवश्यकता होगी। – user2864740

उत्तर

5

मैं किसी भी तरह से कर रहा हूँ अजगर की अंदरूनी कामकाज पर एक विशेषज्ञ का मतलब है, लेकिन मेरी समझ से अब तक आप

for item in sizes: 
    if(item == min(sizes)): 
     count = count + 1 

और

min_item = min(sizes) 
for item in sizes: 
    if(item == min_item): 
     count = count + 1 

की गति अब की तुलना करना चाहते अगर कोई यह गलत है तो मुझे सही करें, लेकिन

पायथन सूचियों में उत्परिवर्तनीय हैं और इसकी निश्चित लंबाई नहीं है, और इन्हें माना जाता है हां, जबकि सी में एक सरणी का एक निश्चित आकार होता है। this question से:

अजगर सूचियों बहुत लचीला कर रहे हैं और पूरी तरह से विषम, मनमाने ढंग से डेटा पकड़ कर सकते हैं, और वे करने के लिए बहुत कुशलता से संलग्न किया जा सकता परिशोधित निरंतर समय में,। यदि आपको अपने सरणी समय को कम करने और बढ़ने की ज़रूरत है-कुशलतापूर्वक और परेशानी के बिना, वे जाने का रास्ता हैं। लेकिन वे सी सरणी से बहुत अधिक जगह का उपयोग करते हैं।

अब इस उदाहरण

for item in sizes: 
    if(item == min(sizes)): 
     new_item = item - 1 
     sizes.append(new_item) 

ले तो item == min(sizes) का मूल्य अगले चरण पर अलग होगा। पाइथन min(sizes) के परिणामी मान को कैश नहीं करता है क्योंकि यह उपरोक्त उदाहरण को तोड़ देगा, या यह जांचने के लिए कुछ तर्क की आवश्यकता है कि सूची बदल दी गई है या नहीं। इसके बजाय यह आपको छोड़ देता है। min_item = min(sizes) को परिभाषित करके आप अनिवार्य रूप से परिणाम को कैश कर रहे हैं।

अब चूंकि सरणी सी में एक निश्चित आकार है, इसलिए यह पाइथन सूची से कम ओवरहेड के साथ न्यूनतम मान पा सकता है, इस प्रकार मैं सोचता हूं कि में सी में कोई समस्या नहीं है (साथ ही सी बहुत कम है स्तर की भाषा)।

फिर से, मैं पाइथन के लिए अंतर्निहित कोड और संकलन को पूरी तरह से समझ नहीं पा रहा हूं, और मुझे यकीन है कि यदि आपने पाइथन में लूप की प्रक्रिया का विश्लेषण किया है, तो आप पाइथन बार-बार min(sizes) पर कंप्यूटिंग देखेंगे, जिसके कारण अत्यधिक मात्रा में अंतराल। मुझे अजगर के आंतरिक कार्यों के बारे में अधिक जानना अच्छा लगेगा (उदाहरण के लिए, पाइथन के लिए लूप में कैश किए गए किसी भी तरीके हैं, या प्रत्येक पुनरावृत्ति के लिए सबकुछ फिर से गणना की जाती है?) ताकि अगर किसी के पास अधिक जानकारी और/या सुधार हो, तो मुझे जानना!

+0

जबकि आपके पास कोई बिंदु है और मैंने आपका जवाब स्वीकार कर लिया है, तो चेतावनी दीजिये कि मुझे नहीं लगता कि यह 100% स्पष्ट है। उदाहरण के लिए मैंने अभी भी 'std :: vector' के साथ ऐसा ही सोचा और 115.9 सेकेंड प्राप्त किया। और वेक्टर की लचीलापन के बावजूद, 8.4 सेकंड, जो नाटकीय गति दिखाता है। तो, मैं कहूंगा कि डेटा संरचना-लचीलापन के मामले में यह एक [टैग: पायथन] चीज है। – gsamaras

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

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