10GB の RAM がある大きなファイルで文字列 "And" の出現回数を調べるように依頼されました。どうすれば効率的にできますか。私は、それぞれ 100MB のメモリ チャンクでファイルを読み取り、各メモリ チャンクで "And" の合計出現回数を見つけ、文字列 "And" の累積カウントを保持する必要があると答えました。インタビュアーは私の答えに満足せず、コマンド grep が unix でどのように機能するかを教えてくれました。python で似たようなコードを書いてみたのですが、答えがわかりませんでした。この質問への回答をいただければ幸いです。
			
			2834 次
		
2 に答える
            5        
        
		
ファイルを反復処理して、行を返します。この場合、検索文字列に行末文字が含まれていないため簡単です。そのため、一致が行をまたぐことを心配する必要はありません。
with open("file.txt") as fin:
    print sum(line.count('And') for line in fin)
str.count各回線での使用
>>> ヘルプ (str.count)
method_descriptor に関するヘルプ:
カウント(...)
    S.count(sub[, start[, end]]) -> int
    部分文字列 sub の重複しない出現回数を返します
    文字列 S[開始:終了]。オプションの引数 start と end は解釈されます
    スライス表記のように。
    于 2013-07-23T05:35:51.217   に答える
    
    
            4        
        
		
ジェネレーターを使用すると、大きなファイルにアクセスして処理を行うことができます。
簡単なgrepコマンド、
def command(f):
    def g(filenames, **kwa):
        lines = readfiles(filenames)
        lines = (outline for line in lines for outline in f(line, **kwa))
        # lines = (line for line in lines if line is not None)
        printlines(lines)
    return g
def readfiles(filenames):
    for f in filenames:
        for line in open(f):
            yield line
def printlines(lines):
    for line in lines:
            print line.strip("\n")
@command
def grep(line, pattern):
    if pattern in line:
        yield line
if __name__ == '__main__':
    import sys
    pattern = sys.argv[1]
    filenames = sys.argv[2:]
    grep(filenames, pattern=pattern)
于 2013-07-23T05:30:55.900   に答える