我有一个简单的#[pymythods]-impl
,以最天真的方式使用&pyo3::types::PyIterator
:
/// Construct a `Foo` from an iterator
#[staticmethod]
fn from_iter(iter: &pyo3::types::PyIterator) -> PyResult<Self> {
for mut foo = Self::new()?;
for obj in iter {
foo.bar(obj?)?;
}
Ok(foo)
}
我注意到,当迭代器执行时,内存使用量增长不受限制.关于内存管理的pyo3文档似乎特别提到了这种情况,尽管我不清楚我是否正确理解了这个问题:
在我看来,因为我们使用&'a PyIterator
进入函数,所以我们已经持有GIL,其中'a
绑定到GIL.由于PyIterator
在迭代期间返回&'a PyAny
,并且因为这些对象必须对至少'a
有效,所以迭代过的对象不会在循环的每一次迭代期间被销毁;因此,内存使用量会增长,直到函数返回并且所有东西都被一举收集.
在循环过程中销毁每个obj
的正确策略是什么?文档指向使用unsafe
,我不确定上面的简单代码是否真的需要它.