1 回答

TA贡献1873条经验 获得超9个赞
我做了一些将字典转换为pylist的测量,结果如下:
from timeit import timeit
dictionary = {0:0.2, 9:0.4}
def method1(d, n=10):
return [d[i] if i in d.keys() else 0 for i in range(n)]
def method2(d, n=10):
return [d.get(i, 0) for i in range(n)]
def method3(d, n=10):
return [d.get(i, v) for i, v in enumerate([0] * n)]
def method4(d, n=10):
l = [0] * n
for v, k in dictionary.items():
l[v] = k
return l
print(timeit("method1(dictionary)", globals=globals(), number=1_000_000))
print(timeit("method2(dictionary)", globals=globals(), number=1_000_000))
print(timeit("method3(dictionary)", globals=globals(), number=1_000_000))
print(timeit("method4(dictionary)", globals=globals(), number=1_000_000))
输出为:
1.8713272300001336
1.8894721449996723
2.15010558800077
0.5128111490002993
很明显,这method4是最快的-首先创建固定的零列表,然后仅迭代需要更改的键。
基于这一事实,将元组转换为列表应遵循类似的模式:创建固定列表,然后遍历pytuple并更改该列表中的值。
编辑:
我也对随机词典做了一些测试:
# creating random dictionary
n = random.randint(1000, 100000)
idx = list(range(n))
dictionary = {}
for i in range(random.randint(100, n)):
dictionary[random.choice(idx)] = random.random()
print('n =',n)
print('len(dictionary.keys() =', len(dictionary.keys()))
print(timeit(f"method1(dictionary, n={n})", globals=globals(), number=100))
print(timeit(f"method2(dictionary, n={n})", globals=globals(), number=100))
print(timeit(f"method3(dictionary, n={n})", globals=globals(), number=100))
print(timeit(f"method4(dictionary, n={n})", globals=globals(), number=100))
结果:
n = 82981
len(dictionary.keys() = 32083
1.203233296999315
1.1194271739987016
1.3668270919988572
0.2243523440010904
添加回答
举报