分割大型列表的最快方法

时间:2017-02-27 17:28:24

标签: python list date datetime filter

我有一份DOY数据列表。该列表长达近900,000个条目。我遇到的问题是数据最初会达到365,但是再次从1开始,当我希望它超过365时。例如:

>>> continue_list([140, 141, 145, 270, 365, 365.90, 1, 2, 5, 360])
>>> [140, 141, 145, 270, 365, 365.90, 366, 367, 370, 725] 

这是我的尝试:

def continue_list(x):
    l = []
    m = []
    for i in x:
        if math.floor(i) == 1:
            l = l+ x[x.index(i):]
            l = list(map(lambda x: x+365, l))
            m = m + x[:x.index(i)]
            new_x = m + l
    return new_x

这适用于小型列表。但对于包含900,000个条目的列表,这是不可行的;我的电脑立刻崩溃了。有关更快方法的任何提示吗?

2 个答案:

答案 0 :(得分:1)

如果您正在从文件中读取数据,那么您应该尝试一次操作文件的较小部分。在处理数据时,将输出附加到outfile。例如,读取文件的前1000行。处理它们然后将它们写入outfile。然后继续下一行1000行。这样,python不需要将所有900k行保留在内存中。先前处理过的行将被垃圾收集。

答案 1 :(得分:1)

我会推荐一个发电机:

l = [140, 141, 145, 270, 365, 365.90, 1, 2, 5, 360, 1]

def wrap_at_365(it):
    # The number of wraps that have been found.
    wraps = 0
    it = iter(it)
    # Get the first item
    last = next(it)
    yield last
    for item in it:
        # Identify a wrap by checking if the next item is smaller than the previous
        if item < last:
            wraps += 1
        yield item + 365 * wraps
        last = item

它可以立即转换为list

>>> list(wrap_at_365(l))
[140, 141, 145, 270, 365, 365.9, 366, 367, 370, 725, 731]

在我的电脑上转换包含100万个数字的列表需要大约0.5秒。

但要确定您需要小心的次数。我检查了最后一个项目是否比当前项目大,但是如果它在第1年是100并且下一个项目在第2年代表110则会怎么样?那将是未被发现的,我实际上并不知道如何检测到这一点。您的数据是否包含更多详细信息?那么闰年呢?