我在编程方面经验不多,但我知道一点 Python3,现在我正在迈出学习 Pharo 的第一步。我仍然不熟悉面向对象的编程或类浏览器,但我已经完成了 ProfStef 教程,并且正在玩弄 Playground 上的小程序,以熟悉语法。
我首先好奇的事情之一是这两种语言在速度方面的比较,因为我在某处读到 Pharo 内置了一个 JIT 编译器。所以我用这两种语言写了一个异想天开的小脚本,生成800万个数,过滤1/3,每个计算1/sqrt(x),求和,重复一百次,每次稍微改变间隔,最后再求和,计时整个过程。这不是一个合适的基准,只是一个获得数量级估计的练习,但我试图让两个版本尽可能相似。
Python 3 版本:
import time, math
mega = lambda n: sum([1/math.sqrt(1 + i + n) for i in range(8000000) if (i + 1) // 3 == 0])
start = time.time()
print(sum([mega(n + 1) for n in range(100)]))
stop = time.time() - start
print(stop)
Python 3.8.5 的结果(默认,2020 年 7 月 28 日,12:59:40):
34.7701230607214
52.75216603279114
Pharo 8 版本:
| mega range start stop |.
range := [:n | (((1 to: 8000000) select: [:j | (j quo: 3) = 0]) collect: [:i | 1 / (n + i) sqrt]) sum].
start := DateAndTime now.
Transcript show: (((1 to: 100) collect: [:n | range value: n]) sum); cr.
stop := (DateAndTime now - start) asSeconds.
Transcript show: stop; cr.
Pharo-8.0.0+build.1141.sha.1b7a8d8203fce2a57794451f555bba4222614081(64 位)的结果:
34.7701230607214
45
如我所料,Pharo 版本运行速度更快,但幅度不大,为 45 秒,而 Python 为 52 秒多一点。花费的时间减少了大约 13%。所以我猜他们的速度大约是同一个数量级。这是典型的情况吗?
最佳答案
这种测试并不能说明什么。主要原因是大量的计算包括重复发送相同的消息到相同类的实例(quo:
和 =
for the select:
和 /
、+
、collect:
中的 sqrt
等)。这意味着诸如方法查找之类的耗时(内部)操作只会发生一次,然后就会陷入内联缓存中。因此,您的系统在运行这些基准测试时可能优于另一个系统,而在运行“真实”应用程序时却慢得多。除了(单态或多态)内联缓存,它减少了对方法查找的需要,其他产生差异的技术是垃圾收集器的性能、方法内联(用目标代码的副本替换发送站点)、寄存器分配(用于最小化内存访问)、become:
消息的性能等。众多因素使得测量更复杂的代码片段成为可取的,试图解决我刚才提到的已知瓶颈。有时一个小的改变可能会暴露你系统隐藏的优势(或弱点)。因此,我的建议是,为了进行此类分析,您应该更加努力地尝试并设计旨在衡量系统如何响应特定类型压力的测试。
关于python - Speedwise,Pharo 与 Python3 相比如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65267392/