繁体   English   中英

为什么这个任务在 Python 中比 Julia 更快?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM