python字符串連接超過2個,用join代替+號

python字符串連接效率問題


在python效率的討論問題中字符串的連接效率有提過,多數建議使用join來代替"+"進行字符串連接

python中一切皆對象 字符串對象就是c api中得stringobject.c看python源碼的objects文件可以找到

1."+"。使用加號連接2個字符串會調用靜態函數string_concat(register PyStringObject *a ,register PyObject * b),在這個函數中會開闢一塊大小是a+b的內存的和的存儲單元,然後將a,b字符串拷貝進去,試想一下,如果是n個字符串相連  那麼會開闢n-1次內存,是比較耗費資源的

2.對於使用join函數 "".join([a,b])   會調用string_join函數  會計算列表的長度  一次分配一塊內存然後拷貝,所以n個字符串相連 開闢內存的次數是1次

所以如果只有2個相連效率區別不大  但是數據多了就會有問題

python與c語言在創建變量時候的不同

1。python有小整數緩衝池  PyIntObject就是一個對C語言中long類型的數值的擴展,出於性能考慮,對於小整數,Python使用小整數對象池small_ints緩存了[-5,257)之間的整數,該範圍內的整數在Python系統中是共享的。  當定義一個整數a=3.然後刪除這個整數使用b=3發現a,b的id是一樣的 再使用 c = 12345執行上面的操作我們發現2個數的內存地址不一樣  小整數緩衝池

2。python中定義一個字符串s = "hello",g = "hello"後 ,s,g的地址相同 ,c語言定義char a[5] = "hello",char b[5] = "hello" ,a和b的字符串地址不同 ,說明又申請了一塊內存,python使用的interned機制 首先查詢

>>> a="123"

>>> b="123"

>>> id(a)

46553808L

>>> id(b)

46553808L



>>> a=12345

>>> b=12345

>>> id(a)

47307928L

>>> id(b)

47307880L


小整數:

>>> a=256

>>> b=256

>>> id(a)

35165744L

>>> id(b)

35165744L


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章