Python脚本性能问题:读取文本文件并删除重复项

时间:2018-02-14 09:25:35

标签: python performance

所以,我得到了一个.txt文件,其值以分号分隔。 我想要做的是提取第一列,将值添加到列表但不添加重复项。 我想出的是:

values = []
with open(filename, 'r') as file:
    data = file.readlines()
    for line in data:
        tmpVal = line.split(';')[0]
        if tmpVal not in values:
            values.append(tmpVal)

虽然文件有点大(~706 MB),但这个脚本运行速度很慢(现在实际运行大约10分钟)。

有人可以指出我可以改进代码的地方吗?

万分感谢 杰罗姆

3 个答案:

答案 0 :(得分:2)

  1. 使用集合代替值列表。设置会员资格检查会更快。

    values = set()
    
  2. 不要使用readlines()。只需通过文件本身进行迭代。

答案 1 :(得分:1)

使用set

values = set()
with open(filename, 'r') as file:
    for line in file:
        tmpVal = line.split(';')[0]
        values.add(tmpVal)

答案 2 :(得分:1)

您可以使用的一种可能的改进是使用集合而不是值列表。这将弃用if tmpVal not in values行,这是一个o(n)操作(很贵!)。你的代码将是:

values = set()
with open(filename, 'r') as file:
    data = file.readlines()
    for line in data:
        tmpVal = line.split(';')[0]
        if tmpVal not in values:
            values.add(tmpVal)

并使其更加pythonic:

with open(filename, 'r') as f:
    return set(line.split(';')[0] for line in file.readlines())

或更新版本的python(使用set comprehension):

with open(filename, 'r') as f:
    return {line.split(';')[0] for line in file.readlines()}