我很好奇當我有一個函式時的行為/性能開銷是什么:
async def slow_function(some_resource):
if some_resource in cache.keys():
return cache[some_resource]
return await requests.get(some_resource)
在我們以某種方式快取“some_resource”的情況下,不會執行“await”。在這種情況下,“異步”的開銷是多少?由于沒有達到“等待”陳述句,它實際上是零開銷嗎?或者在呼叫“異步”函式時,無論如何都存在一些不可避免的開銷?
uj5u.com熱心網友回復:
實際上 0 開銷。
異步將像正常功能一樣繼續。開銷是當你達到一個await在鏈中產生未來的時候。
本質上,每次你await一個未完成的Future 時,事件回圈都必須系結到它并繼續一個需要一系列操作的新回圈。如果您await立即回傳而不等待未來,則事件回圈不會回圈,并且該函式會像任何其他生成器函式一樣正常繼續運行。
其余的開銷是普通函式呼叫和生成器初始化之間的區別(因為協程的實作完全相同)。雖然有一些開銷,甚至可能是正常函式呼叫的兩倍或三次(主要與生成器本身的創建有關),但與每個事件回圈周期中發生的具有大量指令的大約 50 或 60 個完整函式呼叫相比,它可以忽略不計.
uj5u.com熱心網友回復:
抱歉,這不是實際問題的答案,但我認為已經涵蓋了
您的代碼存在一個并非無關緊要的性能問題,但它與異步無關。
檢查鍵是否在快取中然后在快取中查找鍵比訪問鍵并以合理的幅度捕獲 KeyError 慢
(這只是查看快取具有密鑰的“快樂”路徑)
>>> import timeit
>>> timeit.timeit('try: cache[x]\nexcept KeyError: pass', setup='cache = {i: i for i in range(500)}; x = 5')
0.0273395610274747
>>> timeit.timeit('if x in cache.keys(): cache[x]', setup='cache = {i: i for i in range(500)}; x = 5')
0.08461441402323544
像這樣的東西可能會表現得稍微好一點
async def slow_function(some_resource):
try:
return cache[some_resource]
except KeyError:
return await requests.get(some_resource)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/389772.html
上一篇:在條件運算式中重新拋出例外
