:あなたは、ファイルの内容を扱っているので、
>>> import array
>>> a = array.array('c', 'foo')
>>> a[1] = 'e'
>>> a
array('c', 'feo')
>>> a.tostring()
'feo'
しかし、 mmap
は、より効率的にする必要があります:
>>> f = open('foo', 'r+')
>>> import mmap
>>> m = mmap.mmap(f.fileno(), 0)
>>> m[:]
'foo\n'
>>> m[1] = 'e'
>>> m[:]
'feo\n'
>>> exit()
% cat foo
feo
はここ(あなたがUnix以外のOSのために何か他のものとDDを交換する必要があります)迅速なベンチマークスクリプトです:
import os, time, array, mmap
def modify(s):
for i in xrange(len(s)):
s[i] = 'q'
def measure(func):
start = time.time()
func(open('foo', 'r+'))
print func.func_name, time.time() - start
def do_split(f):
l = list(f.read())
modify(l)
return ''.join(l)
def do_array(f):
a = array.array('c', f.read())
modify(a)
return a.tostring()
def do_mmap(f):
m = mmap.mmap(f.fileno(), 0)
modify(m)
os.system('dd if=/dev/random of=foo bs=1m count=5')
measure(do_mmap)
measure(do_array)
measure(do_split)
私はいくつかの歳のラップトップは私の直感に合致した上で得た出力:
5+0 records in
5+0 records out
5242880 bytes transferred in 0.710966 secs (7374304 bytes/sec)
do_mmap 1.00865888596
do_array 1.09792494774
do_split 1.20163106918
だから、もしmmapがわずかに速いですが、提案ソリューションのどれも特に違いはありません。大きな違いが見られる場合は、cProfileを使用して時間の流れを確認してみてください。
文字列/ファイルの大きさはどれくらいですか? – SilentGhost
あなたは常に同じ列を置き換えるか、検索と置換を行いますか? – vartec
置き換えられる内容はファイルの内容によって異なります – Zitrax