35

この結果を得るために何かひどく間違ったことをしたのではないかと思っていたので、この質問を投稿しました。

中サイズのcsvファイルがあり、numpyを使用してロードしようとしました。説明のために、python を使用してファイルを作成しました。

import timeit
import numpy as np

my_data = np.random.rand(1500000, 3)*10
np.savetxt('./test.csv', my_data, delimiter=',', fmt='%.2f')

そして、numpy.genfromtxt、numpy.loadtxt の 2 つの方法を試しました。

setup_stmt = 'import numpy as np'
stmt1 = """\
my_data = np.genfromtxt('./test.csv', delimiter=',')
"""
stmt2 = """\
my_data = np.loadtxt('./test.csv', delimiter=',')
"""

t1 = timeit.timeit(stmt=stmt1, setup=setup_stmt, number=3)
t2 = timeit.timeit(stmt=stmt2, setup=setup_stmt, number=3)

そして、結果はt1 = 32.159652940464184, t2 = 52.00093725634724 であることを示しています。
ただし、matlab を使用しようとすると、次のようになります。

tic
for i = 1:3
    my_data = dlmread('./test.csv');
end
toc

結果は次のとおりです。経過時間は3.196465 秒です。

読み込み速度に多少の違いがあることは承知していますが、

  1. これは私の予想をはるかに超えています。
  2. np.loadtxt は np.genfromtxt よりも高速である必要がありますか?
  3. csvファイルのロードは私が頻繁に行うことであり、csvモジュールを使用するとコーディングが少し冗長になるため、まだpython csvモジュールを試していません...しかし、それが唯一の方法である場合は喜んで試してみたいと思います. 現在、私は何か間違ったことをしているのではないかと心配しています。

任意の入力をいただければ幸いです。よろしくお願いします!

4

5 に答える 5

7

numpy 配列を保存して読み取るだけの場合は、サイズに応じてバイナリまたは圧縮バイナリとして保存する方がはるかに優れています。

my_data = np.random.rand(1500000, 3)*10
np.savetxt('./test.csv', my_data, delimiter=',', fmt='%.2f')
np.save('./testy', my_data)
np.savez('./testz', my_data)
del my_data

setup_stmt = 'import numpy as np'
stmt1 = """\
my_data = np.genfromtxt('./test.csv', delimiter=',')
"""
stmt2 = """\
my_data = np.load('./testy.npy')
"""
stmt3 = """\
my_data = np.load('./testz.npz')['arr_0']
"""

t1 = timeit.timeit(stmt=stmt1, setup=setup_stmt, number=3)
t2 = timeit.timeit(stmt=stmt2, setup=setup_stmt, number=3)
t3 = timeit.timeit(stmt=stmt3, setup=setup_stmt, number=3)

genfromtxt 39.717250824
save 0.0667860507965
savez 0.268463134766
于 2013-08-15T19:19:47.597 に答える
1

FWIW組み込みのcsvモジュールはうまく機能し、実際にはそれほど冗長ではありません。

csv モジュール:

%%timeit
with open('test.csv', 'r') as f:
    np.array([l for l in csv.reader(f)])


1 loop, best of 3: 1.62 s per loop

np.loadtext:

%timeit np.loadtxt('test.csv', delimiter=',')

1 loop, best of 3: 16.6 s per loop

pd.read_csv:

%timeit pd.read_csv('test.csv', header=None).values

1 loop, best of 3: 663 ms per loop

個人的にread_csvは pandas を使用するのが好きですが、純粋な numpy を使用している場合は csv モジュールが便利です。

于 2016-05-05T00:36:08.160 に答える