我已经完成了两个算法,我想检查哪一个更“高效”并且使用更少的内存。第一个创建一个numpy数组并修改数组。第二个创建一个python空数组并将值推送到此数组中。 谁更好? 第一个计划:
f = open('/Users/marcortiz/Documents/vLex/pylearn2/mlearning/classify/files/models/model_training.txt')
lines = f.readlines()
f.close()
zeros = np.zeros((60343,4917))
for l in lines:
row = l.split(",")
for element in row:
zeros[lines.index(l), row.index(element)] = element
X = zeros[1,:]
Y = zeros[:,0]
one_hot = np.ones((counter, 2))
第二个:
f = open('/Users/marcortiz/Documents/vLex/pylearn2/mlearning/classify/files/models/model_training.txt')
lines = f.readlines()
f.close()
X = []
Y = []
for l in lines:
row = l.split(",")
X.append([float(elem) for elem in row[1:]])
Y.append(float(row[0]))
X = np.array(X)
Y = np.array(Y)
one_hot = np.ones((counter, 2))
我的理论是,第一个较慢,但使用较少的内存,并且在处理大文件时更“稳定”。第二个它更快,但使用大量内存,并且在处理大文件时不那么稳定(543MB,70,000行)
谢谢!
答案 0 :(得分:1)
这两个代码的问题在于您首先使用file.readlines()
将整个文件加载到内存中,您应该直接迭代文件对象以一次获得一行。
from itertools import izip
#generator function
def func():
with open('filename.txt') as f:
for line in f:
row = map(float, l.split(","))
yield row[1:], row[0]
X, Y = izip(*func())
X = np.array(X)
Y = np.array(Y)
...
我相信一个纯粹的numpy解决方案会比这更快。
答案 1 :(得分:1)
最后,由于答案,我做了一些改变。我的两个项目:
f = open('/Users/marcortiz/Documents/vLex/pylearn2/mlearning/classify/files/models/model_training.txt')
zeros = np.zeros((60343,4917))
counter = 0
start = timeit.default_timer()
for l in f:
row = l.split(",")
counter2 = 0
for element in row:
zeros[counter, counter2] = element
counter2 += 1
counter = counter + 1
stop = timeit.default_timer()
print stop - start
f.close()
第一个节目的时间 - > 122.243036032秒
第二个程序:
f = open('/Users/marcortiz/Documents/vLex/pylearn2/mlearning/classify/files/models/model_training.txt')
zeros = np.zeros((60343,4917))
counter = 0
start = timeit.default_timer()
for l in f:
row = l.split(",")
counter2 = 0
zeros[counter, :] = [i for i in row]
counter = counter + 1
stop = timeit.default_timer()
print stop - start
f.close()
第二个节目的时间:102.208696127秒! 感谢。
答案 2 :(得分:0)
Python在其默认库中有一个有用的profiler。它非常容易使用:只需将代码包装在一个函数中,然后按以下方式调用cProfile.run:
import cProfile
cProfile.run('my_function()')
对这两种情况提出一个建议:你真的不需要读取列表中的所有行。相反,如果你只是迭代文件,你将获得行而不将它们存储在内存中:
f = open('some_file.txt')
for line in f:
# Do something
就内存使用而言,numpy数组明显优于list。