So, the issue with function-calls in loops, in a dynamic language like Python, is that the interpreter has to evalute the refernces each time, and that is costly, especially for global variables. However, notice what happens when you make things local:
import time
def square(x):
return x*x
def test_loop(x):
res = []
for i in x:
res.append(square(i))
return res
def test_map(x):
return list(map(square,x))
def test_map_local(x, square=square):
return list(map(square,x))
def test_loop_local(x, square=square):
res = []
for i in x:
res.append(square(i))
return res
def test_loop_local_local(x, square=square):
res = []
append = res.append
for i in x:
append(square(i))
return res
def test_comprehension(x):
return [square(i) for i in x]
def test_comprehension_local(x, square=square):
return [square(i) for i in x]
x = range(1,10000000)
start = time.time()
test_loop(x)
stop = time.time()
print("Loop:", stop - start,"seconds")
start = time.time()
test_loop_local(x)
stop = time.time()
print("Loop-local:", stop - start, "seconds")
start = time.time()
test_loop_local_local(x)
stop = time.time()
print("Loop-local-local:", stop - start, "seconds")
start = time.time()
test_map(x)
stop = time.time()
print("Map:", stop - start, "seconds")
start = time.time()
test_map_local(x)
stop = time.time()
print("Map-local:", stop - start, "seconds")
start = time.time()
test_comprehension(x)
stop = time.time()
print("Comprehesion:", stop - start, "seconds")
start = time.time()
test_comprehension_local(x)
stop = time.time()
print("Comprehesion-local:", stop - start, "seconds")
Results:
Loop: 3.9749317169189453 seconds
Loop-local: 3.686530828475952 seconds
Loop-local-local: 3.006138563156128 seconds
Map: 3.1068732738494873 seconds
Map-local: 3.1318843364715576 seconds
Comprehesion: 2.973804235458374 seconds
Comprehesion-local: 2.7370445728302 seconds
So, making the function look-up in map local doesn't really help, as I would expect because map does a single look-up at the beginning. What really surprised me is that there seems to be a non-negligible difference between a comprehension and a comprehension with the function made local. Not sure if this is just noise, however.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…