मैं इस question का जवाब दे रहा था, मैं जनरेटर अभिव्यक्ति यहाँ प्राथमिकता दी है और इस है, जो मैंने सोचा था कि तेजी से जनरेटर पहले पूरी सूची बनाने के लिए की जरूरत नहीं है के रूप में किया जाएगा इस्तेमाल किया:जनरेटर अभिव्यक्ति के अजीब समय के परिणाम बनाम सूची समझ?
>>> lis=[['a','b','c'],['d','e','f']]
>>> 'd' in (y for x in lis for y in x)
True
और लेवोन में सूची समझ का इस्तेमाल किया उसके
~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f']]" "'d' in (y for x in lis for y in x)"
100000 loops, best of 3: 2.36 usec per loop
~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f']]" "'d' in [y for x in lis for y in x]"
100000 loops, best of 3: 1.51 usec per loop
:
solution,
>>> lis = [['a','b','c'],['d','e','f']]
>>> 'd' in [j for i in mylist for j in i]
True
लेकिन जब मैं इन नियंत्रण रेखा के लिए timeit परिणाम किया जनरेटर की तुलना में तेजी थी
तो मैं सूची के आकार में वृद्धि, और इसे फिर से समय समाप्त हो गया:
lis=[['a','b','c'],['d','e','f'],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]
खोज 'd'
जनरेटर के लिए इस बार तेजी से नियंत्रण रेखा से था, लेकिन जब मैं एक मध्यम तत्व (11) और पिछले तत्व तो नियंत्रण रेखा फिर से खोजा गया जनरेटर अभिव्यक्ति को धड़कता है, और मैं समझ नहीं पा रहा हूं क्यों?
~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f'],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]" "'d' in (y for x in lis for y in x)"
100000 loops, best of 3: 2.96 usec per loop
~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f'],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]" "'d' in [y for x in lis for y in x]"
100000 loops, best of 3: 7.4 usec per loop
~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f'],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]" "11 in [y for x in lis for y in x]"
100000 loops, best of 3: 5.61 usec per loop
~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f'],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]" "11 in (y for x in lis for y in x)"
100000 loops, best of 3: 9.76 usec per loop
~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f'],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]" "18 in (y for x in lis for y in x)"
100000 loops, best of 3: 8.94 usec per loop
~$ python -m timeit -s "lis=[['a','b','c'],['d','e','f'],[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]" "18 in [y for x in lis for y in x]"
100000 loops, best of 3: 7.13 usec per loop
+1 मुझे जवाबों के लिए भी ट्यून किया जाएगा :) – Levon
शायद कैशिंग के कारण ... और जनरेटर ... शायद अधिक कॉल की आवश्यकता है (अगली, उपज, राज्य को बचाने आदि)। और जनरेटर वास्तव में स्मृति कुशल हैं। वह पक्का है। – User007
क्यों न केवल '(x में x के लिए x में x)'? –