- 不要使用 dict 来存储
m 和 C 的值,而是将它们定义为不同的变量,并仅在返回时创建 dict:
m = []
C = []
...
return {"m": m, "C": C}, lattice
您也可以使用deque 代替列表,它应该比列表更快。
-
当if - 语句中包含and - 条件时,如果第二个条件不影响语句的值,则不会计算第二个条件。换句话说,如果您能够找出哪个语句更有可能失败并首先对其进行评估,那么您可以通过更快地失败来节省一些时间。
-
使用列表追加,您可以通过将追加预分配给它自己的变量来节省时间:
m = []
C = []
app_m = m.append
app_C = C.append
for i in range(r):
if i % 3 == 0:
app_m(i)
app_C(i)
如果您还没有尝试分析您的代码以找出需要时间的原因,我建议您这样做。
评估点 1-3 的脚本:
import timeit
from collections import deque
# for range
r = 20000
# timeit n times
ntimes = 500
def dicts():
d = {"m": [], "C": []}
for i in range(r):
if i % 3 == 0:
d["m"].append(i)
d["C"].append(i)
return d
def lists():
m = []
C = []
for i in range(r):
if i % 3 == 0:
m.append(i)
C.append(i)
return {"m": m, "C": C}
def deques():
m = deque(maxlen=r)
C = deque(maxlen=r)
for i in range(r):
if i % 3 == 0:
m.append(i)
C.append(i)
return {"m": m, "C": C}
t1 = timeit.timeit(dicts, number=ntimes)
t2 = timeit.timeit(lists, number=ntimes)
t3 = timeit.timeit(deques, number=ntimes)
print("dicsts", t1)
print("lists ", t2)
print("deques", t3)
def order1():
m = []
C = []
for i in range(r):
if i % 2 == 0 and i % 5 == 0:
m.append(i)
C.append(i)
return {"m": m, "C": C}
def order2():
m = []
C = []
for i in range(r):
if i % 5 == 0 and i % 2 == 0:
m.append(i)
C.append(i)
return {"m": m, "C": C}
t1 = timeit.timeit(order1, number=ntimes)
t2 = timeit.timeit(order2, number=ntimes)
print("order1", t1)
print("order2", t2)
def listsappend():
m = []
C = []
app_m = m.append
app_C = C.append
for i in range(r):
if i % 3 == 0:
app_m(i)
app_C(i)
return {"m": m, "C": C}
t1 = timeit.timeit(lists, number=ntimes)
t2 = timeit.timeit(listsappend, number=ntimes)
print("normal", t1)
print("predef", t2)