【问题标题】:Why Python3.6 showing better results than 3.7?为什么 Python3.6 显示出比 3.7 更好的结果?
【发布时间】:2018-09-27 10:28:16
【问题描述】:

我有以下代码(没用,只用于性能测试)

class A:
    def __init__(self, i):
        self.i = i

start = datetime.now()
foo = {}
for i in range(10000000):
    foo[i] = A(i)

print('\nSpent: [ {} ] seconds!'.format((datetime.now()-start).total_seconds()))

问题是,当我使用 Python3.7 运行它时,我得到以下结果

Spent: [ 7.644764 ] seconds!

但是当我用 Python3.6 运行它时

Spent: [ 6.521555 ] seconds!

所以问题是,我是否误解了某些东西,或者旧的 python 更快,我应该使用旧的?

UPD:根据 cmets 的建议,我使用了 timeit 模块,这里是结果

python3.7 -m timeit '"-".join(str(n) for n in range(2000000))'
1 loop, best of 5: 499 msec per loop

python3.6 -m timeit '"-".join(str(n) for n in range(2000000))'
10 loops, best of 3: 405 msec per loop

timeit 的结果对于 3.7 来说仍然很糟糕,真的比 3.6 慢吗?

【问题讨论】:

  • 不,这意味着你的计时方法有缺陷。您是否多次运行这两个版本?您是否消除了其他操作系统影响,例如磁盘刷新、垃圾收集和网络活动?
  • 你重复了多少次?
  • 您确实想使用timeit 模块来评估性能。例如,让该模块处理重复和时间测量。
  • 大约 5-7 次,差异总是 0.8 到 1.1 秒(python3.6 更快),但差异很大
  • 您的附加测试在 python3.7 上运行 一次。在较小的范围内,20000,timeit 实际上可以运行更多次测试,我得到5.3 msec5.42 毫秒(3.7 与 3.6)。对于 2000 个元素,时间为 425 usec525 usec。 Python 3.7 并不慢,您的测试仍然存在缺陷。

标签: python python-3.x performance performance-testing


【解决方案1】:

你的计时方法有缺陷。在 6-7 秒内,现代操作系统不会让 Python 独占访问 CPU,其他事情也在发生,因为操作系统在进程之间切换、为正在写入的文件刷新磁盘缓冲区、执行预定的网络事件等。

您还会生成相当多的对象,这些对象都加载到内存中,因此 Python 必须向操作系统询问要分配的额外内存页面。这取决于您的计算机当时正在执行的其他内容,可以提供多快的内存。看来您第二次运行 Python 3.6,因此很容易释放并重新分配给 Python 3.7 运行的内存仍可用于 3.6 运行,并且最近释放的内存更容易为操作系统重新分配。

接下来,您使用了一个相当不精确的挂钟计时器来计时您的表演。 datetime.now() 适合想知道当前时间的人,但不适合测量性能。对于后一项任务,Python 可以使用更好、更专业的时钟。 Python 本身也有一个称为 garbage collector 的后台进程,它也需要一些时间来完成它的工作,这会影响 Python 执行你给它的任务的方式。

相反,您需要将 Python 必须在此处解决的不同问题分离到单独的测试中。在受控情况下运行这些单独的测试,使用准确的时钟,并尽可能多地禁用分心。运行这些测试很多次,然后取平均时间(如果你只有一个可用的聚合)或多次重复的最佳时间。

Python为此提供了一个库,名为timeit。使用它创建实例,而不是将它们全部存储在字典中。如前所述,内存分配取决于操作系统的时间,而不是 Python 的。确保不断重复您的测试;如果-m timeit 只运行一次测试一次你真的不能相信时间安排,减少在基准测试中完成的工作。

接下来,如果您的目标是在一般性能方面比较 Python 3.6 和 3.7,而不是特定的微基准,那么您需要进行广泛的测试。从 3.x 到 3.x+1 版本,东西一直在变化。不要基于单个字符串连接或实例创建测试。并且知道 Python 开发人员将已经完成了所有这些工作。请参阅https://speed.python.org/ 了解核心团队用来监控性能的全套基准和计时,或参阅PyPerformance suite 了解另一个此类基准。

【讨论】:

  • 非常感谢您的宝贵时间,我明白了
猜你喜欢
  • 2018-06-14
  • 2019-03-04
  • 1970-01-01
  • 2018-04-25
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
相关资源
最近更新 更多