簡體   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