簡體   English   中英

用boost.python交換numpy數組:pyublas或boost.numpy?

[英]exchange numpy array with boost.python: pyublas or boost.numpy?

我通過py ++ / boost.python將C ++數據密集庫與Python連接起來。 在對我的程序進行概要分析后,我發現70%的運行時間花費在這樣的代碼上:

ni = range(v2o.getHits())
tau = np.array([v2o.TofCorrectedTime[i] for i in ni])
q = [v2o.getCharge()[i] for i in ni]

v2o.TofCorrectedTime鍵入__array_1_float_2368從PY ++。 v2o.getCharge()也是從py ++中鍵入的_impl_details_range_iterator_ 大小約為2000,從這些py ++數組包裝器到numpy的轉換很慢:

In [42]: timeit np.array(v2o.TofCorrectedTime)
100 loops, best of 3: 2.52 ms per loop

In [43]: timeit np.array(v2o.getCharge())
100 loops, best of 3: 4.94 ms per loop

In [44]: timeit np.array([0]*2368)
1000 loops, best of 3: 310 µs per loop

In [45]: timeit np.array(np.zeros(2368))
100000 loops, best of 3: 4.41 µs per loop

我在網上搜索了一個解決方案。 候選人是:

  1. Cythonmemoryview
  2. pyublas
  3. Boost.NumPy

問題與解答(更新):

  • cython / memoryview是否易於與boost.python和py ++集成? 我想保留庫包裝的其余部分。

    不。(吉姆的回答)

    cython c ++包裝器和boost.python具有內在不同的基礎結構。 他們很難相互交談。 (雖然原則上我們可以教py ++輸出cython代碼。但這是另一個故事。)

    使用Boost.NumPy擴展當前包裝是最易於管理的方式。

  • 在轉換開銷方面哪一個最適合我的問題?

    (還沒有確切的答案。)

謝謝

(免責聲明:我是Boost.NumPy的主要作者。)

我擔心這些選項都不是特別棒。 以下是我認為pro / con分析的方法:

  • Cython擁有大量的用戶和開發人員,因此如果您使用該選項,您將獲得更多支持。 但是,它根本沒有與Boost.Python集成,我認為使Cython對象與Boost.Python交流是一項巨大的工作,更不用說Py ++了。 你可能需要非常了解Cython和Boost.Python的低級實現細節才能實現這一目標。 如果你想使用Cython,你可能最好不要廢棄你的Py ++ / Boost.Python包裝器。

  • Boost.NumPy擁有一個更小的社區,因此支持資源更加有限,但它更適合您已有的代碼。 Py ++對Boost.NumPy一無所知,因此它不會自動生成使用它的代碼(可能是你可以教Py ++關於Boost.NumPy;我對Py ++不太熟悉),但它非常簡單將自定義Boost.Python代碼(以及Boost.NumPy代碼)添加到Py ++項目中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM