Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
准确测试Pypy与CPython的性能_Python_Performance_Benchmarking_Pypy - Fatal编程技术网

准确测试Pypy与CPython的性能

准确测试Pypy与CPython的性能,python,performance,benchmarking,pypy,Python,Performance,Benchmarking,Pypy,问题描述: 我有一个自定义的“校验和”函数: NORMALIZER = 0x10000 def get_checksum(part1, part2, salt="trailing"): """Returns a checksum of two strings.""" combined_string = part1 + part2 + " " + salt if part2 != "***" else part1 ords = [ord(x) for x in com

问题描述:

我有一个自定义的“校验和”函数:

NORMALIZER = 0x10000


def get_checksum(part1, part2, salt="trailing"):
    """Returns a checksum of two strings."""

    combined_string = part1 + part2 + " " + salt if part2 != "***" else part1
    ords = [ord(x) for x in combined_string]

    checksum = ords[0]  # initial value

    # TODO: document the logic behind the checksum calculations
    iterator = zip(ords[1:], ords)
    checksum += sum(x + 2 * y if counter % 2 else x * y
                    for counter, (x, y) in enumerate(iterator))
    checksum %= NORMALIZER

    return checksum
我想在Python3.6和pypypy性能方面对其进行测试。我想看看这个函数在PyPy上是否会表现得更好,但我不完全确定,最可靠和干净的方法是什么

我的尝试和问题:

目前,我正在使用
timeit
来处理以下两种情况:

$ python3.6 -mtimeit -s "from test import get_checksum" "get_checksum('test1' * 100000, 'test2' * 100000)"
10 loops, best of 3: 329 msec per loop

$ pypy -mtimeit -s "from test import get_checksum" "get_checksum('test1' * 100000, 'test2' * 100000)"
10 loops, best of 3: 104 msec per loop
我担心的是,我不能完全确定
timeit
是否适合
PyPy
上的工作,因为存在以下问题

此外,PyPy本身在报告测试结果之前会报告以下内容:

WARNING: timeit is a very unreliable tool. use perf or something else for real measurements
pypy -m pip install perf
pypy -m perf timeit -s 'from test import get_checksum' "get_checksum('test1' * 1000000, 'test2' * 1000000)"

要在这些Python实现和其他Python实现中测试相同的精确函数性能,最好和最准确的方法是什么?

您可以使用
--repeat
参数增加重复次数,以提高计时精度。见:


你想测量什么还不完全清楚。根据您的用例,“性能”可以指各种各样的东西

  • 您是否试图在一切都预热后测量函数的原始速度(特别是JIT,但也包括库导入、文件加载等)?然后你可能想像Haroldo__OK建议的那样重复一遍。有了足够的重复,花在代码其他部分的时间将逐渐变得“无关紧要”
  • 您是为了学习还是为了真实世界的用例而度量事物?如果是后者,最好在类似的条件下测试代码(传递给函数的字符串长度、迭代次数、代码的热/冷调用…)。我的印象是,使用而不是CLI将为您提供更大的灵活性,以准确衡量您所追求的目标
值得注意的是,如果你正在寻找“真实世界”的测量值,也许你想重新打开它(参见链接了解如何操作)

如果您试图提高速度,那么使用Python3.6都支持的探查器可以帮助隔离您想要测量其速度的代码吗


实际上我并没有回答你的问题,但我希望这能有所帮助:)

这测试(时间)有什么用吗?看来你只执行了一个设置,没有真正的测试命令?@MSeifert啊,我是个白痴,你说得对极了。那里只设置了一个,我已经更新了答案,留下了问题的后半部分。谢谢