c के खूबसूरत दुनिया से आ रहा है, मैं इस व्यवहार को समझने की कोशिश कर रहा हूँ:क्या निरंतर परिणाम के साथ फ़ंक्शन कॉल को प्रतिस्थापित करने के लिए पर्याप्त पाइथन स्मार्ट है?
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
...:
तो क्या हुआ?
मेरा अनुमान है: python नहीं समझ सकता है कि min(sizes)
हमेशा स्थिर हो जाएगा, इस प्रकार अपनी वापसी value..since अजगर दुभाषिया का उपयोग करता है के साथ पहले कुछ कॉल के बाद की जगह ..
min() नहीं करता है के रेफरी कुछ भी नहीं कहें जो मुझे इस मामले को समझाएगा, लेकिन मैं जो सोच रहा था वह यह हो सकता है कि इसे करने के लिए विभाजन को देखने की आवश्यकता हो, लेकिन यह मामला नहीं होना चाहिए, क्योंकि sizes
list
है , नहीं 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 से नामांकित पशु का दृष्टिकोण उपयोग किया।
पहला कोड 'ओ (एन * एन)' है, दूसरा कोड 'ओ (एन) 'है। यह परिकल्पना का समर्थन कैसे करता है? – user2864740
सीपीथन केवल वास्तव में सरल अनुकूलन करता है। भाषा की गतिशील प्रकृति भी कई अनुकूलन असंभव बनाती है: उदाहरण के लिए, कल्पना करें कि क्या कुछ अन्य कोड 'min = lambda x: 1' किया गया है। –
कोई गैर-शुद्ध भाषा नहीं है जिसे मैं जानता हूं कि यह अनुकूलन "समझने" की भी कोशिश करेगा। इसके लिए वैध होने के लिए निर्धारक व्यवहार की गारंटी की आवश्यकता होगी। – user2864740