python - Python vs Julia 速度比较
问题描述
我试图比较这两个片段,看看一秒钟可以完成多少次迭代。事实证明,Julia 实现了 250 万次迭代,而 Python 实现了 400 万次。朱莉娅不是应该更快吗?或者也许这两个片段不等价?
Python:
t1 = time.time()
i = 0
while True:
i += 1
if time.time() - t1 >= 1:
break
朱莉娅:
function f()
i = 0
t1 = now()
while true
i += 1
if now() - t1 >= Base.Dates.Millisecond(1000)
break
end
end
return i
end
解决方案
这是一种奇怪的性能比较,因为通常人们衡量的是计算实质内容所花费的时间,而不是查看在一定时间内可以进行多少次微不足道的迭代。我无法让您的 Python 和 Julia 代码正常工作,因此我修改了 Julia 代码以使其正常工作,只是没有运行 Python 代码。正如@chepner 在评论中指出的那样,使用对象now()
进行时间比较DateTime
是相当昂贵的。Pythontime.time()
函数只返回一个浮点值。事实证明,有一个名为 Julia 的函数time()
可以做同样的事情:
julia> time()
1.587648091474481e9
这是您在我的系统上的原始f()
功能(修改为可以工作)的时间:
julia> using Dates
julia> function f()
i = 0
t1 = now()
while true
i += 1
if now() - t1 >= Millisecond(1000)
break
end
end
return i
end
f (generic function with 1 method)
julia> f()
4943739
在时间结束之前,它进行了近 500 万次迭代。正如我所说,我无法让您的 Python 代码在我的系统上运行而无需大量摆弄(我没有费心去做)。但这里有一个版本f()
,time()
我会想象地称之为g()
:
julia> function g()
i = 0
t1 = time()
while true
i += 1
if time() - t1 >= 1
break
end
end
return i
end
g (generic function with 1 method)
julia> g()
36087637
这个版本进行了 3600 万次迭代。所以我猜 Julia 的循环速度更快?耶!好吧,实际上这个循环中的主要工作是调用time()
so... Julia 在生成大量time()
调用方面更快!
为什么这个时间很奇怪?正如我所说,这里的大部分实际工作都是调用time()
. 循环的其余部分实际上并没有做任何事情。在优化的编译语言中,如果编译器看到一个不做任何事情的循环,它将完全消除它。例如:
julia> function h()
t = 0
for i = 1:100_000_000
t += i
end
return t
end
h (generic function with 1 method)
julia> h()
5000000050000000
julia> @time h()
0.000000 seconds
5000000050000000
哇,零秒!这怎么可能?好吧,让我们看看LLVM 代码(有点像机器代码,但对于用作中间表示的假想机器),它降低为:
julia> @code_llvm h()
; @ REPL[16]:1 within `h'
define i64 @julia_h_293() {
top:
; @ REPL[16]:6 within `h'
ret i64 5000000050000000
}
编译器看到循环,发现每次的结果都是一样的,然后只返回那个常量值而不是实际执行循环。当然,这需要零时间。
推荐阅读
- java - Spring boot不扫描主包的子子包
- c# - Powershell 不显示本地计算机上安装的 Microsoft.ACE.OLEDB.12.0 驱动程序
- javascript - Heroku 使用 Puppeteer 的内存使用量突然飙升
- spring - Mongo 数据库刷新对 Spring Boot Rest API 的影响
- javascript - NSIS 安装程序删除另一个安装文件
- reactjs - React Native 中的 Rect DevTools 错误:无法检查具有 id 的元素
- xml - xml阅读器尝试了太多自动重定向错误
- node.js - 禁用 knex oracledb 自动提交
- c++ - 每次构建项目时如何复制目录?
- javascript - 如何将 dat.gui 参数保存到后端,我正在使用 django 和 three.js 和 dat.gui