python - Pypy3用字典慢
问题描述
TOTAL_NUM_DATA
为什么 pypy3 中的字典函数在1000 万或更大时会变慢。当它的 900 万时,它似乎要快得多。
考虑test.py
:
import datetime
import random
start = datetime.datetime.now()
TOTAL_NUM_DATA = 10_000_000
ACTION = ['add', 'rem']
QUANTITY = [1, 5, 10, 20, 100, 200, 300, 500, 1000]
RAND_SPREAD = 10_000
DATA = [{'action': random.choice(ACTION),
'key': random.randint(0, RAND_SPREAD),
'val': random.choice(QUANTITY)} for x in range(TOTAL_NUM_DATA)]
print("data: ", datetime.datetime.now() - start)
def test(DATA):
d = {}
for data in DATA:
if data['action'] == 'add':
key = data['key']
if key in d:
d[key] += data['val']
else:
d[key] = data['val']
start = datetime.datetime.now()
test(DATA)
print("done: ", datetime.datetime.now() - start)
使用 pypy3 输出:
data: 0:00:12.977063
done: 0:01:06.856763
使用 python3.8 输出:
data: 0:00:30.279252
done: 0:00:02.483877
如您所见,python3.8 通过了测试,只用了大约 2 秒。pypy3 花了超过 1 分钟。无论有多少数据,在 pypy3 中生成 DATA 总是更快。Pypy3 似乎在访问字典中的值时放慢了速度,并且还执行if key in d
.
奇怪的是,变成TOTAL_NUM_DATA
了 900 万:
使用 pypy3 输出:
data: 0:00:11.873104
done: 0:00:00.659081
使用 python3.8 输出:
data: 0:00:27.464615
done: 0:00:02.245507
有人可以解释为什么 pypy3 会发生这种情况。而且,我怎样才能为数据超过 1000 万的 pypy3 优化它。
解决方案
推荐阅读
- excel - 直到下一行的自动填充连续日期具有值
- php - 如何从 Stripe 对象 PHP 中获取关联数组
- autodesk-forge - 尝试从 BIM 360 URN 显示 SVF 时出错
- pandas - 计算带有条件的连续熊猫数据框行之间的天差
- java - 使用 Volley / RecyclerView 从按钮单击的 JSON 中提取新信息
- apache-spark - 从“未配置分区重置策略的偏移量超出范围”中恢复
- python - 为什么这个类的所有实例都具有相同的 end_pos 变量,即使我用不同的值初始化它们
- javascript - React-mde WYSIWYG 编辑器绝对链接
- algorithm - 练习面试问题并想知道如何处理这个又名算法
- c++ - 进程数量增加导致 MPI 性能损失