0

我需要在 python 中操作一个字符串,为此我从字符串中创建一个字符列表,因为 python 字符串是不可变的:

str = 'abc'
list(str)

问题是字符串最多可以包含一百万个字符,我不确定创建列表是否会减慢代码速度。

上述任务的复杂性是什么?有没有比操作字符串更好的选择?

4

3 回答 3

4

我们应该忘记小的效率,比如大约 97% 的时间:过早优化是万恶之源。然而,我们不应该放弃那关键的 3% 的机会。一个好的程序员不会因为这样的推理而自满,他会明智地仔细查看关键代码;但只有在识别出该代码之后。对程序的哪些部分真正关键做出先验判断通常是错误的,因为一直使用测量工具的程序员的普遍经验是,他们的直觉猜测失败了。——Donald Knuth(强调我的)

换句话说,除非你已经分析了你的代码并且它很慢,因为你正在将你的字符串转换为一个列表,否则不要担心 - 在其他地方可能会获得更大的收益。

于 2013-03-25T12:01:33.237 回答
1

我得到这样的结果:

~ $ 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
于 2013-03-25T12:53:58.130 回答
1

如果我理解正确,您需要从文件中读取字符串,修改它然后写回文件?如果这是最节省内存的方法是使用 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()
于 2013-03-25T12:13:32.183 回答