2013-06-04 63 views
2

我正在創建一個「實時」進程,該進程從SierraChart更新的專有格式化OHLCVTBA文件中獲取數據。讀取數據並使用生成器創建數據幀的代碼已發佈on pastebinPython Pandas全局vs傳遞變量

我已經意識到我的結構(新數據驅動)是錯誤的,而且我即將對其進行重新組織。 PhE's question and Wes's response已經使我填補了預填充數據框的工作方向。我的問題在於:

將數據框和指針保持爲全局變量或將它們傳遞給使用它們的各種函數會更快嗎?此外,還有其他的考慮是否應該推動這一選擇?

謝謝。

回答

5

Local variables are faster to access than global variables in python

在大熊貓的情況下,這意味着你應該應該將變量傳遞到函數中,這是有意義的(這意味着它們可以在函數內部找到更快)。相反,python中的函數調用非常昂貴(如果你要調用它們),這就是爲什麼numpy/pandas儘可能使用向量化函數的原因。 顯然,如果你在一個函數內部做事,你必須小心以確保所有的計算都在原地完成。

我通常會首先以「pythonic」/「pandastic」方式工作,然後再擔心速度。然後使用%timeit並查看它是否已經足夠快(通常是)。添加一個unittest(s)。調整速度,%timeit,%prun和%timeit一些。如果這是一個大項目vbench

+0

這很好,但沒有考慮到許多變量的傳遞(當然,分析將會)。 – Elazar

+0

@Elazar這是真的......否則你可以在黑暗中拍攝:)(而不是瞄準最慢的東西。) –

+0

謝謝安迪。我已將我的代碼轉換爲類形式,並將添加核心進程時間的可選日誌,以確認進程在數據時間內運行。 [這是更新的版本](http://pastebin.com/Gyy6MNu3) 這些類使它更清晰和更容易維護,因此檢查我到達該階段的時間會很有趣。 –

2

您需要對其進行配置,但我的猜測是,如果有任何顯着差異,它是贊成全局。該引用仍在內存中,並且不會發生引用計數。 (編輯:無論如何,請參閱@Andy Hayden關於他們的相對訪問時間的鏈接,以及鏈接here,它表示局部變量要快得多)。

主要考慮的是「軟件工程」 - 使用全局數據是一個bad idea,因爲它很難隨時隨地進行更改。當然,如果你不能滿足要求(運行時),那麼它必須完成;但爲了知道它 - 首先測量

無論如何,我會推薦一個不同的解決方案 - 將這些數據保存在一個類中。它將花費更多的字典查找(第一次查找是變量名稱,它無論如何都會發生;第二次是在類詞典中的查找),但它可能比傳遞許多對象更有效,並且會幫助組織你的程序。

+0

感謝您的回覆。好。我將設置一個簡單的1000x版本並使用iPython進行配置。 --- 關於類 - 如果我在包括DF,指針等的類中設置它,我不會有相同的開銷,而是一個更漂亮的oo定向結構(這可能是足夠的原因去做吧)? –

+0

它會像一個單獨的對象傳遞,而不是許多(如果這是你的問題)。是的,它將花費兩次字典查找而不是一次。 – Elazar

+0

測試: 它增加了61ns的過程或0.2%這些短的功能 所以它是微不足道的。 http://i.imgur.com/Hzx4zwX。png –