पर'starmap` को प्राथमिकता दी जा सकती है, तो Clunky calculation of differences between an incrementing set of numbers, is there a more beautiful way? प्रश्न का उत्तर देते हुए, मैं दो समाधानों के साथ आया, List Comprehension
और अन्य itertools.starmap
का उपयोग कर रहा था।जब 'सूची समझ'
मेरे लिए, list comprehension
सिंटेक्स अधिक स्पष्ट, पठनीय, कम वर्बोज़ और अधिक पायथनिक दिखता है। लेकिन अभी भी starmap
इटारटोल में अच्छी तरह से उपलब्ध है, मैं सोच रहा था, इसके लिए एक कारण होना चाहिए।
मेरा प्रश्न है जब starmap
List Comprehension
से अधिक पसंद किया जा सकता है?
नोट शैली की बात तो यह निश्चित रूप से There should be one-- and preferably only one --obvious way to do it.
हेड हेड से तुलना
पठनीयता में गिना जाता है के विपरीत है तो इसकी। --- LC
इसकी फिर से धारणा की बात है, लेकिन मेरे लिए LC
starmap
की तुलना में अधिक पठनीय है। starmap
का उपयोग करने के लिए, या तो आपको operator
आयात करने की आवश्यकता है, या lambda
या कुछ स्पष्ट multi-variable
फ़ंक्शन को परिभाषित करने और फिर भी itertools
से अतिरिक्त आयात को आयात करने की आवश्यकता है।
प्रदर्शन --- LC
>>> def using_star_map(nums):
delta=starmap(sub,izip(nums[1:],nums))
return sum(delta)/float(len(nums)-1)
>>> def using_LC(nums):
delta=(x-y for x,y in izip(nums[1:],nums))
return sum(delta)/float(len(nums)-1)
>>> nums=[random.randint(1,10) for _ in range(100000)]
>>> t1=Timer(stmt='using_star_map(nums)',setup='from __main__ import nums,using_star_map;from itertools import starmap,izip')
>>> t2=Timer(stmt='using_LC(nums)',setup='from __main__ import nums,using_LC;from itertools import izip')
>>> print "%.2f usec/pass" % (1000000 * t1.timeit(number=1000)/100000)
235.03 usec/pass
>>> print "%.2f usec/pass" % (1000000 * t2.timeit(number=1000)/100000)
181.87 usec/pass
मुझे नहीं लगता कि आपके द्वारा किए गए तरीके की तुलना करना उचित है। दोनों कार्यों को मतभेदों को 'डेल्टास' में सहेजना चाहिए क्योंकि फिलहाल 'use_star_map' कम पठनीय है क्योंकि यह सब एक पंक्ति में है। इसे यहां बदलें: 'deltas = starmap (उप, ज़िप (nums [1:], nums)) '' sum (deltas)/float (len (nums) -1) ' – jamylak
@jamylak: इसे इंगित करने के लिए धन्यवाद। लेकिन दुर्भाग्य से यह प्रदर्शन अंतर नहीं बदलता है। – Abhijit
इसका मतलब नहीं था लेकिन हम पठनीयता के बारे में भी बात कर रहे हैं। – jamylak