我需要在 python 中操作一个字符串,为此我从字符串中创建一个字符列表,因为 python 字符串是不可变的:
str = 'abc'
list(str)
问题是字符串最多可以包含一百万个字符,我不确定创建列表是否会减慢代码速度。
上述任务的复杂性是什么?有没有比操作字符串更好的选择?
我需要在 python 中操作一个字符串,为此我从字符串中创建一个字符列表,因为 python 字符串是不可变的:
str = 'abc'
list(str)
问题是字符串最多可以包含一百万个字符,我不确定创建列表是否会减慢代码速度。
上述任务的复杂性是什么?有没有比操作字符串更好的选择?
我们应该忘记小的效率,比如大约 97% 的时间:过早优化是万恶之源。然而,我们不应该放弃那关键的 3% 的机会。一个好的程序员不会因为这样的推理而自满,他会明智地仔细查看关键代码;但只有在识别出该代码之后。对程序的哪些部分真正关键做出先验判断通常是错误的,因为一直使用测量工具的程序员的普遍经验是,他们的直觉猜测失败了。——Donald Knuth(强调我的)
换句话说,除非你已经分析了你的代码并且它很慢,因为你正在将你的字符串转换为一个列表,否则不要担心 - 在其他地方可能会获得更大的收益。
我得到这样的结果:
~ $ cat test.py
#!/usr/bin/python2.7
import time
import random
length = len( str(random.random()) )
longString = ""
for x in range(1000000 / length):
longString += str( random.random() )
a = time.time()
li = list(longString)
b = time.time()
print "Time was: " + str(b - a) + " seconds"
print "Length of list" , len(li)
print "length of string " , len(longString)
print "Sample of list: " , li[:100]
~ $ ./test.py
Time was: 0.0284309387207 seconds
Length of list 999863
length of string 999863
Sample of list: ['0', '.', '0', '5', '3', '2', '0', '9', '3', '0' ....actually longer
如果我理解正确,您需要从文件中读取字符串,修改它然后写回文件?如果这是最节省内存的方法是使用 mmap 模块,您不需要构建列表。以下是模块官方文档中的示例:
import mmap
# write a simple example file
with open("hello.txt", "wb") as f:
f.write(b"Hello Python!\n")
with open("hello.txt", "r+b") as f:
# memory-map the file, size 0 means whole file
mm = mmap.mmap(f.fileno(), 0)
# read content via standard file methods
print(mm.readline()) # prints b"Hello Python!\n"
# read content via slice notation
print(mm[:5]) # prints b"Hello"
# update content using slice notation;
# note that new content must have same size
mm[6:] = b" world!\n"
# ... and read again using standard file methods
mm.seek(0)
print(mm.readline()) # prints b"Hello world!\n"
# close the map
mm.close()