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