Предполагая, что вы не используете кодировку текста переменной длины, такие как UTF-8, вы можете использовать array.array
:
>>> 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 ОС):
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
Так ММАП немного быстрее, но ни один из предложенных решений не является особо отличается. Если вы видите огромную разницу, попробуйте использовать cProfile, чтобы узнать, что занимает время.
насколько велика строка/файл? – SilentGhost
Вы всегда заменяете одну и ту же колонку или выполняете поиск и замену? – vartec
Что заменяется, зависит от содержимого файла – Zitrax