[英]Why is this task faster in Python than Julia?
我在 RStudio 中运行了以下代码:
exo <- read.csv('exoplanets.csv',TRUE,",")
df <- data.frame(exo)
ranks <- 570
files <- 3198
datas <- vector()
for ( w in 2:files ) {
listas <-vector()
for ( i in 1:ranks) {
name <- as.character(df[i,w])
listas <- append (listas, name)
}
datas <- append (datas, listas)
}
它读取一个巨大的 NASA CSV 文件,将其转换为 dataframe,将每个元素转换为字符串,并将它们添加到向量中。
RStudio 耗时 4 分 15 秒。
所以我决定在 Julia 中实现相同的代码。 我在 VS Code 中运行了以下命令:
using CSV, DataFrames
df = CSV.read("exoplanets.csv", DataFrame)
fil, col = 570, 3198
arr = []
for i in 2:fil
for j in 1:col
push!(arr, string(df[i, j]))
end
end
结果很好。 Julia 代码只用了 1 分 25 秒!
然后出于纯粹的好奇心,这次我在 Python 中实现了相同的代码进行比较。 我在 VS Code 中运行了以下命令:
import numpy as np
import pandas as pd
exo = pd.read_csv("exoplanets.csv")
arr = np.array(exo)
fil, col = 570, 3198
lis = []
for i in range(1, fil):
for j in range(col):
lis.append(arr[i][j].astype('str'))
结果让我震惊? 只有35秒?!! 而在 Anaconda 的 Spyder 中只需 26 秒!!! 将近200万个花车!!! Julia 在数据分析中是否比 Python 慢? 我可以改进 Julia 代码吗?
这取决于您要测试的内容(即,如果您想测试循环或只想快速获得结果)。 我假设您希望结果快速且代码简洁,在这种情况下,我将在 Julia 中以以下方式编写此操作:
arr = reduce(vcat, eachrow(Matrix(string.(df[2:570, 1:3198]))))
您能否确认这会产生预期的结果,该操作的时间是什么? (在此我假设您的行数多于 570,列数多于 3198,因此我首先将它们子集)
如果您想测试循环,那么您的答案下的评论将开始相关。
另请注意,您的 DataFrames.jl 代码与 R 和 Python 中的代码执行的操作不同(循环顺序不同,请您仔细检查您需要的内容)。 这种差异对性能至关重要。 我已经为您提供了重现 DataFrames.jl 代码行为的代码(与 R/Python 代码相比,这是您想要做的更难/更慢的变体)
注意:假设您想要其他列顺序,我写了以下内容。 Julia 这种方式效率更高; 为了使其与您的原始行为等效,请在正确的位置排列逻辑或数据(作为练习留下)。 Bogumił 的回答已经做对了。
将东西放入函数中,在可能的情况下进行预分配,按步序迭代,使用视图,并使用内置函数和广播:
function tostringvector(d)
r, c = size(d)
result = Vector{String}(undef, r*c)
v = reshape(result, r, c)
for (rcol, dcol) in zip(eachcol(v), eachcol(d))
@inbounds rcol .= string.(dcol)
end
return result
end
这当然可以更难优化。
或者更短,利用DataFrames
已经提供的功能:
tostringvector(d) = vec(Matrix(string.(d)))
鉴于您对@phipsgabler 答案的评论,您在这里计时的是导入模块和编译的固定成本,而不是任务本身。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.