问题标签 [pyo3]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
143 浏览

rust - rusqlite 和 pyo3 PyResult 处理错误

我正在尝试在 pyo3 的帮助下打开并写入我将从 python 调用的 Rust 库中的数据库。如果发生错误,我想引发一个可以在调用 Python 进程中捕获的异常,但是我在终止执行和引发错误时遇到了困难。

我的理解是,通过restore在对象上调用函数PyIOError会引发错误,但是,我一定是误解了,因为编译器似乎认为它是一种conn未初始化的可能性:

这里有什么合适的方法?

0 投票
0 回答
110 浏览

python-3.x - rust 链接因 aarch64-linux-android-clang 失败,找不到 -lpython3.6m

因此,提供一些背景信息:我想使用带有 python Kivy 应用程序的外部(rust)库来进行实验性的自学目的。我不知道从哪里开始,因为我从来没有在编译过程中太深入,所以我决定尝试使用 python-for-android 接收外部模块。在失败了几次之后,我考虑在我的 python 文件中对导入使用 try-except,然后将与 android 兼容的 rust 模块添加到 APK 中。我不知道它是否会工作,但到目前为止,我在为 android 编译我的 rust 库时遇到问题,因为它似乎错过了一些与 python 相关的库,这可能是因为我使用 pyo3。我不确定我应该如何解决这个问题,因为这是我第一次在 Linux(尤其是 Ubuntu)上为 android 编译一些东西。

如果有人能告诉我如何修复链接过程,我将不胜感激,以下是日志: https ://pastebin.pl/view/3d6a69ac 另外,如果您知道如何以更好的方式实现我的目标,请同时提及。

0 投票
0 回答
68 浏览

python - 将 PyBytes 从 Rust 传递到 Python 时,如何确保正确释放内存?

我有一个使用 PyO3 的 Rust 库,我的一个函数如下所示:

从 Python 中,我可以成功获取我的数据:

我发现我第一次调用它时,它工作正常。我第二次调用它时,我的库打印出消息然后失败,给了我类似的东西memory allocation of 1073741824 bytes failed——这意味着失败发生在它们之间的内存传递中。

如果我按顺序运行其中两个调用,我会发现我的 RAM 利用率在第一次调用后大约为 11 GiB;在第二次调用失败之前,它会飙升至 >16 GiB。现在,我正在做一些测试,其中我实际上并没有使用返回数据,只是简单地覆盖它;基本上:

看来的数据是在 Rust 中分配的,返回给 Python,然后没有被释放。我可以做些什么(在 Rust 或 Python 中)来确保内存被释放?

0 投票
0 回答
114 浏览

python - 如何制作一个 Rust 结构,在不同的线程中修改自己的值?

我正在使用 pyo3 制作一个用 Rust 编写的 Python 模块,它将:

  • 运行自己的线程
  • 读取 Raspberry Pi 上的输入引脚,计算状态更改的次数
  • 让 Python 查询计数器

到目前为止,我的代码如下所示:

这段代码有效,但我遇到的问题是以某种方式获取线程内实例的引用,以便我可以更新count,同时仍然让 Pythoncount随时检查。

我认为这样的事情会起作用,但它没有:

请注意,我必须将结构的t类型转换为Option<thread::JoinHandle()>>,因为在这里,我需要在创建线程之前创建实例。另外,我的new方法现在返回 anArc<Self>而不是 just Self,我不完全确定我是否可以这样做。

我也尝试过使用Arc<Mutex<CountWatcher>>,但是我需要Arc<Mutex<CountWatcher>>从新返回一个,或者返回inst_2.lock(),这只会永久锁定它。

0 投票
0 回答
157 浏览

python - 在创建 Python 类时,如何在 Rust 中使用 pyo3 创建析构函数方法?

我在 Rust 中使用 pyo3 来创建 Python 模块。我可以创建一个类和一个构造函数:

当我编译它并使用 Python 中的类时,我可以看到我的实例有一个__del__方法,我可以手动调用它,但是当实例被销毁时 Python 不会调用它:

有没有一种特殊的方法可以使用 pyo3 在 Rust 中创建析构函数?为什么 Python 不调用__del__del当您实例化时,为纯 Python 中定义的类调用它似乎没有问题。

0 投票
0 回答
209 浏览

rust - 如何制作一个在调用开销和处理速度方面与 C-Extensions 完全一样的 Python “rust-Extension”模块?

我发现的更接近的选择是pyo3,但我不清楚与传统的 C 扩展相比它是否增加了任何额外的开销。从这里看来,通过借用对象似乎可以实现这种 C 扩展行为 (我仍然需要详细了解这个概念)。我的部分问题来自于构建过程(此处为Rust 的 Python 部分)完全由同时引用cpythonpyo3的cargo管理。

有关增加一些开销但不是基于 rust 的方法示例,请参阅此比较

一个相关的问题是关于可移植性的,因为似乎存在一种开销-可移植性权衡。

对于那些喜欢了解具体案例的人来说,它是关于以不可预测的顺序使用数百万次的类似散列的小型操作。因此,无论是纯 Python 还是批处理原生方法都无济于事。此外,与纯 Python 相比,第一次尝试使用 C 扩展已经有收获。现在,我想在编写其余函数之前在 Rust 中实现它。

0 投票
1 回答
301 浏览

python - 为什么 cython 嵌入式插件在 cpython 解释器中的性能比 rust-c 接口版本更高?

想问一些关于python解释器底层原理的问题,因为我自己搜索的时候没有得到太多有用的信息。

我最近一直在使用 rust 编写 python 插件,这大大加快了 python 的 cpu 密集型任务,并且与 c 相比,它的编写速度也更快。但是它有一个缺点是,与使用cython加速的旧方案相比,rust(我使用pyo3)的调用开销似乎大于c(我使用cython)的调用开销,

例如,我们在这里得到了一个空的 python 函数:

在 Python 中通过 for 循环调用它一百万次并计算时间,这样我们就可以发现每个调用大约需要 70 纳秒(在我的电脑中)。

如果我们将其编译为 cython 插件,使用相同的源代码:

执行时间将减少到 40 纳秒。这意味着我们可以使用 cython 进行一些细粒度的嵌入,并且我们可以期望它总是比原生 python 执行得更快。

然而,说到 Rust,(老实说,我更喜欢使用 rust 进行插件开发而不是 cython,因为现在不需要在语法上做一些奇怪的修改),调用时间将增加到 140 纳秒,几乎是本机蟒蛇。源代码如下:

这意味着rust不适合python的细粒度嵌入式替换。如果有一个任务调用时间很少,每次调用都需要很长时间,那么使用 rust 就完美了。但是如果代码中有一个任务会被大量调用,那么它似乎不适合 rust ,因为类型转换的开销会占用大部分加速时间。

我想知道这是否可以解决,更重要的是,我想知道这种差异的根本原因。cpython解释器在它们之间调用时是否有某种区别,比如调用c插件时cpython和pypy之间的区别?我在哪里可以获得更多信息?谢谢。

===

更新:

抱歉各位,没想到我的问题会含糊不清,毕竟这三个的源代码都已经给出了,使用timeit来测试函数运行时几乎是python开发中的惯例。

我的测试代码与注释中的@Jmb 代码几乎完全相同,但我使用python setup.py build_ext --inplace构建方式而不是裸 gcc 的方式存在一些细微差别,但这不应该有任何区别。无论如何,谢谢你的补充。

0 投票
1 回答
365 浏览

python - 使用 PyO3 将列表列表作为参数从 Python 传递给 Rust

我正在尝试使用 Py03 将列表从 Python 传递给 Rust。我试图将其传递给的函数具有以下签名:

我正在为预先存在的库编写绑定,因此我无法更改原始代码。我目前的做事方式是这样的:

x.as_slice()函数几乎可以满足我的需要,它给了我一片向量&[Vec<f32>],而不是一片片&[[f32; 3]]

我希望能够运行这个 Python 代码:

0 投票
0 回答
162 浏览

rust - Rust pyo3:有什么方法可以通过引用将参数传递给 pyfunction?

这是我的一段代码,它当然可以工作。但就速度而言,这是无法忍受的。我的怀疑是复制过程使它变慢。在我的机器上,我通过 numpy 将 5120x 5120 矩阵转换为字节并传递给它,这需要 3 秒才能完成工作。由于我的服务器非常好,我预计这类工作不会花很长时间

这是我的数据结构定义。

0 投票
2 回答
422 浏览

python - PyO3 在使用 Anaconda 时找不到 Python 解释器

考虑以下 Rust 代码:

使用“标准”Python 安装,它运行良好,并打印it works. 我尝试在 Windows 上使用全新安装的 Anaconda 运行此代码,它输出以下内容:

似乎所有 sys 可执行文件都指向错误的位置。

Rust 环境信息:

这是输出conda info -a

有人可以指出我做错了什么吗?我已经尝试过研究,但那里没有太多资源。