【问题标题】:Efficient array storage高效的阵列存储
【发布时间】:2013-01-20 19:18:00
【问题描述】:

我有一个大型(300,000 行 x 25 列)数组,我在其中读取

dataset = numpy.genfromtxt(DataFileName,dtype="string",delimiter=',')

然后清理换行符和引号。我尝试了两种方式:

第一种清理方法

for i in range(len(dataset)): 
    for j in range(len(dataset[i])):
        dataset[i][j] = dataset[i][j].replace("\n", "").replace("\"", "")

第二种清理方法

dataset = [ [word.replace('\n','').replace('"','') for word in dataset[i]] for i in range(len(dataset))]

在此之后,我对数组进行了一些密集搜索以计算一堆东西。如果我使用第二种方式而不是第一种方式进行清理,则搜索速度会快 5 倍。是什么原因?

【问题讨论】:

  • 哇,确实很好奇。好吧,我看到的两个主要区别是,在第二种情况下,您使用和迭代器并将元素复制到新列表中,而不是就地更新。您是否尝试过在第二个中使用[[word... for word in row] for row in dataset] 而不是for i in ...
  • 正如 Laurent 指出的那样,在一种情况下,您正在搜索一个 numpy 数组,在另一种情况下是一个列表。如果在第二种情况下,您将所有右侧包裹在 numpy.array(...) 中,您应该得到与第一种情况完全相同的结果。根据您的经验,您不想这样做,因为对于您正在做的工作,列表似乎比数组更有效。此外,genfromtext 允许您定义可以在读取数据时进行清理的 converters 函数,有关详细信息,请参阅文档:docs.scipy.org/doc/numpy/reference/generated/…
  • 如果您不向我们展示您的搜索方式,我们如何判断为什么在第二种情况下搜索速度更快? +1 詹姆。我现在正要写这个。我要指出,当您有 numerical 数据要处理时,numpy 是很好的。在大多数其他情况下,它只是比纯 python 解决方案慢(这通常还包括任意大整数运算)
  • 数据元素(被搜索、处理等)目前都作为字符串进行操作——尽管它都是数字,所以可以想象在使用 genfromtext 读取数据时使用转换器来清理数据会有所帮助。
  • 您能否提供几行数据,并概述您在清理后对它们运行的​​操作?

标签: python arrays numpy replace storage


【解决方案1】:

一般来说,列表推导(第二种方式)比 for 循环更快。我忘记了它的原因。

另外,如果您有一个大型数据集,使用 xrange() 比使用 range() 更快,因为 xrange() 返回一个小型生成器,它会即时生成数据。而 range() 返回整个列表 [0 .. 300,000]。

最后,您应该考虑完全取消 range()、xrange():

dataset = [[word.replace('\n','').replace('"','') for word in line] for line in dataset]

这样做更干净,应该更快,因为你不处理数组订阅,这需要时间。

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2012-10-14
    相关资源
    最近更新 更多