我已经完成了两种算法,我想检查其中哪一种算法更“高效”,并且使用更少的内存。第一个方法创建一个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))我的理论是,第一个比较慢,但使用的内存更少,而且在处理大文件时更“稳定”。第二种,它速度更快,但占用大量内存,在处理大型文件(543 of,70000行)时,内存不太稳定。
谢谢!
发布于 2013-07-31 13:55:51
最后,由于答案,我做了一些改变。我的两个节目:
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秒!谢谢。
发布于 2013-07-31 13:13:13
这两种代码的问题是,首先使用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)
...我相信一个纯粹的解决方案会比这更快。
发布于 2013-07-31 13:13:42
Python的默认库中有一个有用的轮廓仪。它非常容易使用:只需将代码包装在一个函数中,并以以下方式调用cProfile.run:
import cProfile
cProfile.run('my_function()')对于这两种情况,有一个建议:您真的不需要将所有的行都读到列表中。相反,如果您只是在文件中进行迭代,您将得到行,而无需将它们存储在内存中:
f = open('some_file.txt')
for line in f:
# Do something在内存使用方面,numpy数组明显优于list。
https://stackoverflow.com/questions/17971044
复制相似问题