Python输入/输出优化

时间:2017-01-17 22:48:48

标签: python

我认为这段代码执行时间太长,所以也许有更好的方法来执行此操作。我没有找到与并行化for循环或使用多个处理器相关的答案。

我想要做的是从"文件"中读取值。使用" np.genfromtxt(文件)"。我有209 * 500 * 16这些文件。我想提取209循环的最高1000值的最小值,并将这500个值放在16个不同的文件中。如果文件丢失或数据没有足够的大小,则信息将被写入" missing_all"文件。

问题是:

  1. 这是打开文件的最佳方法吗?

  2. 这是写入文件的最佳方法吗?

  3. 如何更快地制作此代码?

  4. 代码:

    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]))
    

1 个答案:

答案 0 :(得分:1)

概述

您可以use a profiler找出脚本的哪些部分占用的时间最多。通过这种方式,您可以确切知道花费最多时间的内容并优化这些行,而不是盲目地尝试优化代码。用于弄清楚探查器如何工作的时间将在以后轻松收回成本。

一些可能的减速

以下是一些猜测,但它们确实只是猜测。

  1. open()只有17个文件,因此您的具体操作可能并不重要。

  2. 我对写作表现不太了解。使用file.write()对我来说似乎很好。

  3. genfromtextfile可能需要一段时间(取决于您的输入文件),loadtxt是您的另一种选择吗?文档声明您可以将它用于没有漏洞的数据。

  4. 使用二进制文件格式而不是文本可以加快读取文件的速度。

  5. 您可以在每次迭代时对数组进行排序。有没有办法只在最后对它进行排序?

  6. 通常询问文件系统的某些内容不是很快,即os.path.isfile(file)可能很慢。您可以尝试创建父目录的所有子项的dict并使用该缓存版本。

  7. 同样,如果您的大多数文件存在,使用例外可以更快:

    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
    
  8. 我没有尝试详细了解您的代码。也许你可以通过使用更智能的算法来减少必要的工作?

  9. PS:我喜欢你试图在同一列上放置所有等号。不幸的是,这使得阅读代码变得更加困难。