有串聯字符串:str + str或「{:s} {:s}」。format()?
str_ = "foo" + "bar"
和
str_ = "{:s}{:s}".format("foo","bar")
任何區別還是純粹的偏好?
有串聯字符串:str + str或「{:s} {:s}」。format()?
str_ = "foo" + "bar"
和
str_ = "{:s}{:s}".format("foo","bar")
任何區別還是純粹的偏好?
語義上?不,最終加入"foo"
和"bar"
並將它們分配到str
。
Computationally?當然,Python在編譯期間會爲"foobar"
創建文字,str = "foo" + "bar"
分配將會更快。
從可讀性方面?同樣,str = "foo" + "bar"
肯定更清晰簡潔。
兩個你的例子常見的勘誤表是,你分配給被內置的名字,所以不這樣做,你掩蓋它這str
。
我知道'str'是內置的,只是用它作爲名稱。會改變。 – socrates
@socrates避免了這種情況,它可能會導致你在生活中不需要的惡劣情況:-) –
要完成@Jim解釋,這裏是展示這兩種方法之間的比較有點風向標:F1 = 4.49492255239s和f2 = 47.5562411453s
所以:
# measure execution time
import timeit
def f1(num_iterations):
for i in range(num_iterations):
value = "foo" + "bar"
def f2(num_iterations):
for i in range(num_iterations):
value = "{:s}{:s}".format("foo", "bar")
N = 100000000
print timeit.timeit('f1(N)', setup='from __main__ import f1, N', number=1)
print timeit.timeit('f2(N)', setup='from __main__ import f2, N', number=1)
在我的筆記本電腦,結果使當N很大時,結論是使用格式比使用更簡單的str級聯版本慢得多。
這是'timeit'的一個奇怪用法。您已將循環放入測量中,只運行一次。對於'f1'來說,循環的成本遠遠大於你試圖使用的時間的成本,結果是沒有意義的。 'timeit('value =「foo」+「bar」')'會是更標準的做法。 – tdelaney
問候吉姆回答,使用+
運算符與許多字符串,可以很慢。
避免做這樣的事情:
s = ' '
for p in parts:
s += p
每個+=
操作創建一個新的字符串。爲了避免這種情況,請使用join()
。在你的例子中,你不需要使用+
。只需將它們相鄰放置,不加+。
string = 'foo' 'bar'
print(string)
>"foobar"
請注意''foo「」bar「'* only *適用於字符串文字,併發生在」編譯「時間。 –
@WayneWerner是的,就像OP問題一樣。 – levi
如果你想看到實際的區別:
import dis
def concat():
return 'foo' + 'bar'
def format():
return '{}{}'.format('foo', 'bar')
dis.dis(concat)
print('*'*80)
dis.dis(format)
同樣,只是'dis.dis(「'foo'+'bar'」)'和'dis.dis('「{:s} {:s}」.format(「foo」,「bar」)') '。 –
我最近讀到+是小弦更快。但我認爲它是一個風格或可讀性的問題 –
相關:http://stackoverflow.com/q/3055477/344286 –
''foo「+」bar「'被編譯器轉換爲''foobar」',所以運行時成本爲零。更好的比較可能是'foo =「foo」; bar =「bar」; str_ = foo + bar'。 – tdelaney