首页 > 解决方案 > 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 优化它。

标签: pythondictionaryoptimizationpypy

解决方案


推荐阅读