Angenommen, Sie sind nicht mit variabler Länge Textcodierung wie UTF-8, verwenden Sie array.array
verwenden können:
>>> import array
>>> a = array.array('c', 'foo')
>>> a[1] = 'e'
>>> a
array('c', 'feo')
>>> a.tostring()
'feo'
Aber da Sie mit dem Inhalt einer Datei zu tun hat, mmap
sollte effizienter sein:
>>> 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
Hier ist ein schneller Benchmarking-Skript (Sie werden mit etwas anderes für nicht-Unix-Betriebssysteme dd ersetzen müssen):
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)
Output Ich habe auf meinem mehrjährigen Laptop paßt meine Intuition:
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
So Mmap etwas schneller ist, aber keine der vorgeschlagenen Lösungen ist besonders unterschiedlich. Wenn Sie einen großen Unterschied sehen, versuchen Sie cProfile zu verwenden, um zu sehen, was die Zeit kostet.
Wie groß ist die Zeichenkette/Datei? – SilentGhost
ersetzen Sie immer die gleiche Spalte, oder Sie suchen und ersetzen? – vartec
was ersetzt wird, hängt vom Inhalt der Datei ab – Zitrax