Python:快速迭代文件

时间:2013-10-17 09:51:28

标签: python iteration

我需要迭代两个文件数百万次, 计算整个文件中单词对的出现次数。 (为了建立两个单词的列联表来计算Fisher的精确测试分数)

我目前正在使用

from itertools import izip
src=tuple(open('src.txt','r'))
tgt=tuple(open('tgt.txt','r'))
w1count=0
w2count=0
w1='someword'
w2='anotherword'
for x,y in izip(src,tgt):
    if w1 in x:
         w1count+=1
    if w2 in y:
         w2count+=1
    .....

虽然这还不错,但我想知道是否有更快的方法来迭代两个文件,希望显着更快。

我提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我仍然无法确切地知道你想要做什么,但这里有一些示例代码可能会指向正确的方向。

我们可以使用字典或collections.Counter实例来计算所有出现的单词,并通过文件一次性进行计数。之后,我们只需要查询内存中的数据。

import collections
import itertools
import re

def find_words(line):
    for match in re.finditer("\w+", line):
        yield match.group().lower()

counts1 = collections.Counter()
counts2 = collections.Counter()
counts_pairs = collections.Counter()

with open("src.txt") as f1, open("tgt.txt") as f2:
    for line1, line2 in itertools.izip(f1, f2):
        words1 = list(find_words(line1))
        words2 = list(find_words(line2))
        counts1.update(words1)
        counts2.update(words2)
        counts_pairs.update(itertools.product(words1, words2))

print counts1["someword"]
print counts1["anotherword"]
print counts_pairs["someword", "anotherword"]

答案 1 :(得分:0)

一般情况下,如果您的数据足够小以适应内存,那么您最好的选择是:

  1. 将数据预处理到内存

  2. 从内存结构中迭代

  3. 如果文件很大,您可以预先处理数据结构,例如压缩数据,并保存为pickle等加载速度快得多的格式。在单独的文件中处理然后处理它。

答案 2 :(得分:0)

就像一个开箱即用的思维解决方案: 您是否尝试将文件转换为Pandas数据框?即我假设您已经从输入中创建了一个单词列表(通过删除读取符号,如。和),并使用input.split('')或类似的东西。然后,您可以进入DataFrames,执行wordd计数,然后进行笛卡尔连接?

import pandas as pd
df_1 = pd.DataFrame(src, columns=['word_1'])
df_1['count_1'] = 1
df_1 = df_1.groupby(['word_1']).sum()
df_1 = df_1.reset_index()

df_2 = pd.DataFrame(trg, columns=['word_2'])
df_2['count_2'] = 1
df_2 = df_2.groupby(['word_2']).sum()
df_2 = df_2.reset_index()

df_1['link'] = 1
df_2['link'] = 1

result_df = pd.merge(left=df_1, right=df_2, left_on='link', right_on='link')
del result_df['link']

我使用这样的东西进行篮子分析,效果很好。