2 回答

TA貢獻1757條經驗 獲得超8個贊
這是 Python。在您可能想到的意義上,沒有編譯器。假設您使用的是 CPython(參考解釋器),所有內容都通過一個巨大的 switch 語句循環運行,該語句讀取并解釋每個字節碼。您對分支預測的擔憂在這里無關緊要;在您執行的每個操作中,在類型檢查、動態函數指針查找和調用等之間,都會有六個 CPU 級分支。switch
當它最終讀取字節碼時,遠程跳轉可能會稍微損害數據緩存幾百字節之外,而不是下一個字節碼,但分支預測(或缺少分支預測)不是問題(100% 可預測的跳轉也會有同樣的問題)。
基本上,你在這里所做的任何可能在 C 中工作并被編譯器的優化器優化為理想代碼的東西在 CPython 中都不起作用。所以不要打擾。編寫您的完整代碼,如果它太慢,則對其進行分析,然后努力優化“最熱門”(最常被調用)的部分。你在這里進行了過早的優化,真的應該停止。
如果我是你,我會選擇選項#1(可能替換if a & 0x80:
為,if a >= 0x80:
因為前者需要返回一個int
必須進行更昂貴的真值測試,而后者bool
直接返回,這是最便宜的真值測試) ,因為它很簡單,不太可能很糟糕;僅當您的程序太慢時才調查其他選項,并且分析表明這段特定的代碼是熱點。

TA貢獻1775條經驗 獲得超8個贊
(-1)**(a & 0x80)計算功率,所以它非常低效。實際上,您可以將其替換1 if exponent & 1 == 0 else -1為 exponent being a & 0x80。但是通過做從 0 或 1 得到 1 和 -1 更容易x*2 - 1
一些非分支版本
return (((a >> 7) << 1) - 1)*b;
return (((a >> 6) & 0x02) - 1)*b;
return math.copysign(b, -(a >> 7));
return math.copysign(b, -(a & 0x80));
添加回答
舉報