numpy.loadtxt намного медленнее, чем open ..... readlines () - PullRequest
0 голосов
/ 08 сентября 2018

при сравнении двух способов сделать одно и то же:

import numpy as np
import time
start_time = time.time()
for j in range(1000):
    bv=np.loadtxt('file%d.dat' % (j+1))
    if(j%100==0):   
        print bv[300,0] 
T1=time.time() - start_time
print("--- %s seconds ---" % T1)

и

import numpy as np
import time
start_time = time.time()
for j in range(1000):
    a=open('file%d.dat' % (j+1),'r')
    b=a.readlines()
    a.close()
    for i in range(len(b)):
        b[i]=b[i].strip("\n")
        b[i]=b[i].split("\t")
        b[i]=map(float,b[i])
    bv=np.asarray(b)
    if(j%100==0):   
        print bv[300,0]  
T1=time.time() - start_time
print("--- %s seconds ---" % T1)

Я заметил, что второй намного быстрее. Есть ли способ сделать что-то такое же краткое, как первый, и такое же быстрое, как второй? Почему loadtxt так медлителен при выполнении той же задачи вручную?

1 Ответ

0 голосов
/ 08 сентября 2018

С помощью простого, не слишком большого CSV, созданного с помощью:

In [898]: arr = np.ones((1000,100))
In [899]: np.savetxt('float.csv',arr)

версия в текстовом формате:

In [900]: timeit data = np.loadtxt('float.csv')
112 ms ± 119 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

fromfile может загружать текст, хотя он не сохраняет никакой информации о форме (без очевидного преимущества в скорости)

In [901]: timeit data = np.fromfile('float.csv', dtype=float, sep=' ').reshape(-1,100)
129 ms ± 1.27 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

самая краткая версия «руководства», которую я могу придумать:

In [902]: %%timeit
     ...: with open('float.csv') as f:
     ...:     data = np.array([line.strip().split() for line in f],float)
52.9 ms ± 589 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Это 2-кратное улучшение по сравнению с loadtxt кажется типичным для вариаций этого.

pd.read_csv примерно в то же время.

genfromtxt немного быстрее, чем loadtxt:

In [907]: timeit data = np.genfromtxt('float.csv')
98.2 ms ± 4.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...