⑴ 濡備綍瀹炵幇python騫跺彂鍚屾椂澶勭悊100涓鑰楁椂璇鋒眰錛
瑕佸疄鐜癋astAPI騫跺彂鍚屾椂澶勭悊100涓鑰楁椂璇鋒眰錛屽彲浠ュ熷姪寮傛ョ紪紼嬪拰澶氱嚎紼嬬殑鎶鏈銆
鍦‵astAPI涓錛屽彲浠ヤ嬌鐢≒ython鐨勫崗紼嬪簱asyncio鏉ュ疄鐜板紓姝ョ紪紼嬨傞氳繃浣跨敤async鍜宎wait鍏抽敭瀛楋紝鍙浠ュ畾涔夊紓姝ュ嚱鏁幫紝浣垮緱璇鋒眰鍙浠ュ湪絳夊緟鑰楁椂鎿嶄綔鐨勫悓鏃跺勭悊鍏朵粬璇鋒眰銆
鍚屾椂錛屽彲浠ヤ嬌鐢ㄥ氱嚎紼嬫潵澧炲姞騫跺彂澶勭悊鑳藉姏銆侾ython鎻愪緵浜唗hreading妯″潡鏉ユ敮鎸佸氱嚎紼嬬紪紼嬨傚彲浠ュ皢姣忎釜璇鋒眰鐨勫勭悊鏀懼湪涓涓鍗曠嫭鐨勭嚎紼嬩腑榪愯岋紝浠庤屽疄鐜板苟鍙戝勭悊銆
鍘熷洜鏄錛屽綋涓涓璇鋒眰鎵ц屼竴涓鑰楁椂鎿嶄綔鏃訛紝濡傛灉浣跨敤鍚屾ユ柟寮忥紝鏁翠釜璇鋒眰澶勭悊嫻佺▼浼氳闃誨烇紝鐩村埌鑰楁椂鎿嶄綔瀹屾垚銆傝繖浼氬艱嚧鏈嶅姟鍣ㄦ棤娉曞勭悊鍏朵粬璇鋒眰錛岄犳垚鎬ц兘鐡墮堛傝屼嬌鐢ㄥ紓姝ョ紪紼嬪拰澶氱嚎紼嬪彲浠ュ湪絳夊緟鑰楁椂鎿嶄綔鐨勫悓鏃訛紝澶勭悊鍏朵粬璇鋒眰錛屾彁楂樻湇鍔″櫒鐨勫苟鍙戝勭悊鑳藉姏銆
闇瑕佹敞鎰忕殑鏄錛屽苟鍙戝勭悊100涓鑰楁椂璇鋒眰騫朵笉鎰忓懗鐫鍚屾椂澶勭悊100涓璇鋒眰錛屽洜涓烘湇鍔″櫒鐨勫勭悊鑳藉姏鏄鏈夐檺鐨勩傚疄闄呬笂錛屾湇鍔″櫒鍙鑳戒細鏍規嵁鍏惰祫婧愬拰閰嶇疆錛岄檺鍒跺悓鏃跺勭悊鐨勮鋒眰鏁伴噺銆傚洜姝わ紝鍦ㄥ苟鍙戝勭悊鑰楁椂璇鋒眰鏃訛紝闇瑕佹牴鎹鏈嶅姟鍣ㄧ殑瀹為檯鎯呭喌榪涜岄傚綋鐨勮皟浼樺拰閰嶇疆錛屼互紜淇濇ц兘鍜岀ǔ瀹氭с
姝ゅ栵紝榪樺彲浠ラ氳繃浣跨敤璐熻澆鍧囪鍣ㄣ佷紭鍖栨暟鎹搴撴煡璇㈢瓑鎶鏈鏉ヨ繘涓姝ユ彁楂樻湇鍔″櫒鐨勫苟鍙戝勭悊鑳藉姏錛屼互搴斿瑰ぇ閲忕殑鑰楁椂璇鋒眰銆
⑵ 用Python 做策略回測,耗時很長,有什麼加速辦法
1. 在動手優化之前,先profile看看,程序時間都花在哪些地方了:
python -m cProfile -o output.prof your_program
跑完之後,會生成一個output.profile文件。接下來需要對這個文件進行分析,這方面的工具我推薦SnakeViz,神器。安裝非常簡單,pip install snakeviz 即可。
snakeviz output.prof
運行之後,會打開一個瀏覽器窗口,好好看看,哪些函數耗時最多,耗時是因為調用次數太多呢,還是因為單次調用耗時長,明確優化重點;
2. 減少重復計算,緩存計算結果。看看 functools.lru_cache。
3. 能用list comprehension的地方,不要用for;能用numpy的地方,不要手寫循環,不要用pandas;
4. 看你的回測,40w個tick的話,數據量不算大,應該是直接load到內存里的吧?
5. 還是慢的話,上Numba — Numba,就是安裝麻煩一些,使用起來非常方便,速度提高一兩個數量級沒問題;
6. 如果你用的包PyPy都支持的話,試試pypy;
7. Cython、c mole,上面的都沒效果的話,這個是最後的候選方案了。
⑶ python 列印出函數執行所用時間
使用timeit模塊,先介紹下:
timeit 模塊
timeit模塊定義了接受兩個參數的Timer類。兩個參數都是字元串。 第一個參數是你要計時的語句或者函數。 傳遞給Timer的第二個參數是為第一個參數語句構建環境的導入語句。 從內部講,timeit構建起一個獨立的虛擬環境, 手工地執行建立語句,然後手工地編譯和執行被計時語句。
一旦有了Timer對象,最簡單的事就是調用timeit(),它接受一個參數為每個測試中調用被計時語句的次數,默認為一百萬次;返回所耗費的秒數。
Timer對象的另一個主要方法是repeat(), 它接受兩個可選參數。 第一個參數是重復整個測試的次數,第二個參數是每個測試中調用被計時語句的次數。 兩個參數都是可選的,它們的默認值分別是3和1000000。repeat()方法返回以秒記錄的每個測試循環的耗時列表。Python有一個方便的min函數可以把輸入的列表返回成最小值,如: min(t.repeat(3, 1000000))
你可以在命令行使用timeit模塊來測試一個已存在的Python程序,而不需要修改代碼。
再給你個例子,你就知道怎麼做了。
#-*-coding:utf-8-*-
#!/bin/envpython
deftest1():
n=0
foriinrange(101):
n+=i
returnn
deftest2():
returnsum(range(101))
deftest3():
returnsum(xforxinrange(101))
if__name__=='__main__':
fromtimeitimportTimer
t1=Timer("test1()","from__main__importtest1")
t2=Timer("test2()","from__main__importtest2")
t3=Timer("test3()","from__main__importtest3")
printt1.timeit(1000000)
printt2.timeit(1000000)
printt3.timeit(1000000)
printt1.repeat(3,1000000)
printt2.repeat(3,1000000)
printt3.repeat(3,1000000)