问题标签 [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.
rust - rusqlite 和 pyo3 PyResult 处理错误
我正在尝试在 pyo3 的帮助下打开并写入我将从 python 调用的 Rust 库中的数据库。如果发生错误,我想引发一个可以在调用 Python 进程中捕获的异常,但是我在终止执行和引发错误时遇到了困难。
我的理解是,通过restore
在对象上调用函数PyIOError
会引发错误,但是,我一定是误解了,因为编译器似乎认为它是一种conn
未初始化的可能性:
这里有什么合适的方法?
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 另外,如果您知道如何以更好的方式实现我的目标,请同时提及。
python - 将 PyBytes 从 Rust 传递到 Python 时,如何确保正确释放内存?
我有一个使用 PyO3 的 Rust 库,我的一个函数如下所示:
从 Python 中,我可以成功获取我的数据:
我发现我第一次调用它时,它工作正常。我第二次调用它时,我的库打印出消息然后失败,给了我类似的东西memory allocation of 1073741824 bytes failed
——这意味着失败发生在它们之间的内存传递中。
如果我按顺序运行其中两个调用,我会发现我的 RAM 利用率在第一次调用后大约为 11 GiB;在第二次调用失败之前,它会飙升至 >16 GiB。现在,我正在做一些测试,其中我实际上并没有使用返回数据,只是简单地覆盖它;基本上:
看来我的数据是在 Rust 中分配的,返回给 Python,然后没有被释放。我可以做些什么(在 Rust 或 Python 中)来确保内存被释放?
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()
,这只会永久锁定它。
python - 在创建 Python 类时,如何在 Rust 中使用 pyo3 创建析构函数方法?
我在 Rust 中使用 pyo3 来创建 Python 模块。我可以创建一个类和一个构造函数:
当我编译它并使用 Python 中的类时,我可以看到我的实例有一个__del__
方法,我可以手动调用它,但是当实例被销毁时 Python 不会调用它:
有没有一种特殊的方法可以使用 pyo3 在 Rust 中创建析构函数?为什么 Python 不调用__del__
?del
当您实例化时,为纯 Python 中定义的类调用它似乎没有问题。
rust - 如何制作一个在调用开销和处理速度方面与 C-Extensions 完全一样的 Python “rust-Extension”模块?
我发现的更接近的选择是pyo3,但我不清楚与传统的 C 扩展相比它是否增加了任何额外的开销。从这里看来,通过借用对象似乎可以实现这种 C 扩展行为 (我仍然需要详细了解这个概念)。我的部分问题来自于构建过程(此处为Rust 的 Python 部分)完全由同时引用cpython和pyo3的cargo管理。
有关增加一些开销但不是基于 rust 的方法示例,请参阅此比较。
一个相关的问题是关于可移植性的,因为似乎存在一种开销-可移植性权衡。
对于那些喜欢了解具体案例的人来说,它是关于以不可预测的顺序使用数百万次的类似散列的小型操作。因此,无论是纯 Python 还是批处理原生方法都无济于事。此外,与纯 Python 相比,第一次尝试使用 C 扩展已经有收获。现在,我想在编写其余函数之前在 Rust 中实现它。
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 的方式存在一些细微差别,但这不应该有任何区别。无论如何,谢谢你的补充。
python - 使用 PyO3 将列表列表作为参数从 Python 传递给 Rust
我正在尝试使用 Py03 将列表从 Python 传递给 Rust。我试图将其传递给的函数具有以下签名:
我正在为预先存在的库编写绑定,因此我无法更改原始代码。我目前的做事方式是这样的:
该x.as_slice()
函数几乎可以满足我的需要,它给了我一片向量&[Vec<f32>]
,而不是一片片&[[f32; 3]]
。
我希望能够运行这个 Python 代码:
rust - Rust pyo3:有什么方法可以通过引用将参数传递给 pyfunction?
这是我的一段代码,它当然可以工作。但就速度而言,这是无法忍受的。我的怀疑是复制过程使它变慢。在我的机器上,我通过 numpy 将 5120x 5120 矩阵转换为字节并传递给它,这需要 3 秒才能完成工作。由于我的服务器非常好,我预计这类工作不会花很长时间
这是我的数据结构定义。
python - PyO3 在使用 Anaconda 时找不到 Python 解释器
考虑以下 Rust 代码:
使用“标准”Python 安装,它运行良好,并打印it works
. 我尝试在 Windows 上使用全新安装的 Anaconda 运行此代码,它输出以下内容:
似乎所有 sys 可执行文件都指向错误的位置。
Rust 环境信息:
这是输出conda info -a
:
有人可以指出我做错了什么吗?我已经尝试过研究,但那里没有太多资源。