(May-20-2020, 03:20 PM)buran Wrote: [ -> ] (May-20-2020, 02:40 PM)perfringo Wrote: [ -> ]I think that using built-in any() is even more efficient approach.
nope, it's not
You are right, even though I referred 'even more efficient' compared to creating set() and then making lookup. But still you are right :-).
>>> test = '''\
... lst = [11, 22, 33, 44, 55]
... target = 11
... target in set(lst)
... '''
>>> timeit(stmt=test, number=10000)
0.008103398999082856
>>> test = '''\
... lst = [11, 22, 33, 44, 55]
... target = 11
... any(target == item for item in lst)
... '''
>>> timeit(stmt=test, number=10000)
0.009728211000037845
I am no expert in timing but it got me interested. If target is first in list and list is little bit bigger then:
>>> test = '''\
... lst = list(range(11, 1000))
... target = 11
... target in set(lst)
... '''
>>> timeit(stmt=test, number=10000)
0.2991924960006145
>>> test = '''\
... lst = list(range(11, 1000))
... target = 11
... any(target == item for item in lst)
... '''
>>> timeit(stmt=test, number=10000)
0.16373216899955878
However, if target is more in the middle of list:
>>> test = '''\
... lst = list(range(11, 1000))
... target = 500
... target in set(lst)
... '''
>>> timeit(stmt=test, number=10000)
0.29931609900086187
>>> test = '''\
... lst = list(range(11, 1000))
... target = 500
... any(target == item for item in lst)
... '''
>>> timeit(stmt=test, number=10000)
0.4031077369945706
If using timeit with setup, the results are (target is first item in list):
>>> timeit('target in set(lst)', setup='lst = list(range(11, 1000)); target=11')
13.232636451997678
>>> timeit('any(target == item for item in lst)', setup='lst = list(range(11, 1000)); target = 11')
0.427400492997549
Target is in the middle:
>>> timeit('target in set(lst)', setup='lst = list(range(11, 1000)); target=500')
13.306210007998743
>>> timeit('any(target == item for item in lst)', setup='lst = list(range(11, 1000)); target = 500')
24.3041033720001
As one could expect from short circuiting - huge differences in any() performance depending the location of the target.