Python 函式呼叫效能記錄

2022-05-19 06:42:32 字數 2769 閱讀 2836

之前用 js 寫專案的時候,專案組用的元件模式,一直感覺很不錯。最近用 python 做新專案,專案結構也延續了元件模式。一直沒有對函式呼叫的效能作了解,今天突發奇想測試了一下,寫了一些測試**

首先定義了幾個 class :

class

a(object):

deftest(self):

pass

class

b(object):

def__init__

(self):

self.a =a()

deftest(self):

pass

class

c(object):

def__init__

(self):

self.b =b()

deftest(self):

pass

class

d(object):

def__init__

(self):

self.c =c()

deftest(self):

pass

對比1:

直接呼叫例項物件身上的方法 和 使用變數快取該方法然後呼叫

n = 10000000

import

timeit

a =a()

t_direct = timeit.timer('

a.test()

', '

from __main__ import a

').timeit(n)

print

'direct call func :

', t_direct

cache =a.test

t_cache = timeit.timer('

cache()

', '

from __main__ import cache

').timeit(n)

print

'cache func call :

', t_cache

print

'performance :

', (t_cache / t_direct)

嘗試多次後得出該情況下的時間結論:

direct call func :  1.14136314392cache func call  :  0.745277881622performance :  0.652971743123

快取方法之後再呼叫,效能大約能提公升 35%

呼叫函式時,python 會臨時建立乙個物件,比如直接呼叫函式 a.test() 時,python 會執行如下步驟:

1: temp = a.test

2: temp()

3: del temp

所以頻繁呼叫時,效能上是乙個問題。記憶體上應該也是乙個問題,感覺會更加頻繁的觸發 gc

對比2:

通過成員變數多層呼叫乙個函式,和直接呼叫物件身上的函式的效能差

t0 = timeit.timer('

d.test()

', '

from __main__ import d

').timeit(n)

print

'0 level:

', t0

t1 = timeit.timer('

d.c.test()

', '

from __main__ import d

').timeit(n)

print

'1 level:

', t1, '

: ', (t1 / t0) * 100t2 = timeit.timer('

d.c.b.test()

', '

from __main__ import d

').timeit(n)

print

'2 level:

', t2, '

: ', (t2 / t1) * 100, '

', (t2 / t0 * 100)

t3 = timeit.timer('

d.c.b.a.test()

', '

from __main__ import d

').timeit(n)

print

'3 level:

', t3, '

: ', (t3 / t2) * 100, '

', (t3 / t0 * 100)

嘗試多次後得出該情況下的時間結論:

0 level:   1.26769399643

1 level:   1.50338602066     :  118.592185882

2 level:   1.74297595024     :  115.936687337      137.491851752

3 level:   1.87865877151     :  107.784549251      148.194972667

基本上,函式呼叫層次多一層,效能消耗會多 5% 到 15% 左右

這個暫時無法詳細的解答。手上也沒有 js 的測試資料,不確定當時 js 些寫專案的時候,是否也存在這個效能問題。

之前碰到一些專案的結構是,寫的時候分成了多個檔案來寫,但是最後執行的時候,會把這多個檔案中定義的 屬性、函式都聚合到乙個 class 身上,成為乙個巨無霸級的 class。一直不理解這麼做的意義是什麼,感覺很臃腫,現在看來 估計為了減少函式呼叫的層次,提高效能。

matlab呼叫python函式記錄一

記錄下,避免以後花時間搜尋 環境配置 遇到的問題 1 pytorch版本問題 當前matlab 2018b 仍舊不支援pytorch 0.4以上,試了google 上的一些方法,和大多一樣仍不能解決問題,因此,將pytorch版本降低為0.3.1,問題解決 示例 python指令碼 test.py ...

Python自學記錄 呼叫函式和定義函式

對於函式,我的理解是 抽象的方法。你不需要它是內部結構是什麼樣子的,只要遵從它給你的規則來使用,就能得到想要的效果。在 python 中,有很多內建的函式供我們呼叫,常用的函式如下 help obj 幫助,解釋傳入的obj type obj 檢視傳入obj的型別 callable obj 檢視obj...

Python呼叫C函式學習記錄

將.c檔案編譯成.so檔案 python中呼叫.so檔案 設現有test.c和test.h檔案,在命令列中輸入 an highlighted block gcc o testlib.so shared fpic test.c匯入.so檔案 an highlighted block import ct...