我认为这段代码执行时间太长,所以也许有更好的方法来执行此操作。我没有找到与并行化for循环或使用多个处理器相关的答案。
我想要做的是从"文件"中读取值。使用" np.genfromtxt(文件)"。我有209 * 500 * 16这些文件。我想提取209循环的最高1000值的最小值,并将这500个值放在16个不同的文件中。如果文件丢失或数据没有足够的大小,则信息将被写入" missing_all"文件。
问题是:
这是打开文件的最佳方法吗?
这是写入文件的最佳方法吗?
如何更快地制作此代码?
代码:
import numpy as np
import os.path
output_filename2 = '/home/missing_all.txt'
target2 = open(output_filename2, 'w')
for w in range(16):
group = 1200 + 50*w
output_filename = '/home/veto_%s.txt' %(group)
target = open(output_filename, 'w')
for z in range(1,501):
sig_b = np.zeros((209*300))
y = 0
for index in range(1,210):
file = '/home/BandNo_%s_%s/%s_209.dat' %(group,z,index)
if not os.path.isfile(file):
sig_b[y:y+300] = 0
y = y + 300
target2.write('%s %s %s\n' % (group,z,index))
continue
data = np.genfromtxt(file)
if (data.shape[0] < 300):
sig_b[y:y+300] = 0
y = y + 300
target2.write('%s %s %s\n' % (group,z,index))
continue
sig_b[y:y+300] = np.sort(data[:,4])[::-1][0:300]
y = y + 300
sig_b = np.sort(sig_b[:])[::-1][0:1000]
target.write('%s\n' % (sig_b[-1]))
答案 0 :(得分:1)
您可以use a profiler找出脚本的哪些部分占用的时间最多。通过这种方式,您可以确切知道花费最多时间的内容并优化这些行,而不是盲目地尝试优化代码。用于弄清楚探查器如何工作的时间将在以后轻松收回成本。
以下是一些猜测,但它们确实只是猜测。
您open()
只有17个文件,因此您的具体操作可能并不重要。
我对写作表现不太了解。使用file.write()
对我来说似乎很好。
genfromtextfile
可能需要一段时间(取决于您的输入文件),loadtxt
是您的另一种选择吗?文档声明您可以将它用于没有漏洞的数据。
使用二进制文件格式而不是文本可以加快读取文件的速度。
您可以在每次迭代时对数组进行排序。有没有办法只在最后对它进行排序?
通常询问文件系统的某些内容不是很快,即os.path.isfile(file)
可能很慢。您可以尝试创建父目录的所有子项的dict并使用该缓存版本。
同样,如果您的大多数文件存在,使用例外可以更快:
try:
data = np.genfromtxt(file)
except FileNotFoundError: # not sure if this is the correct exception
sig_b[y:y+300] = 0
y += 300
target2.write('%s %s %s\n' % (group,z,index))
continue
我没有尝试详细了解您的代码。也许你可以通过使用更智能的算法来减少必要的工作?
PS:我喜欢你试图在同一列上放置所有等号。不幸的是,这使得阅读代码变得更加困难。