gpt4 book ai didi

class - Cython:我可以使用 cppclass 而不是 class 吗?它有任何性能优势吗?

转载 作者:行者123 更新时间:2023-12-05 03:42:59 24 4
gpt4 key购买 nike

我刚开始使用 Cython,我试图替换:

cdef class TestClass:
int m_A

def __init__(self, int a):
self.m_A = a

cdef void test_method(self):
print(self.m_A)

cdef int return_test(self):
return 1

与:

cdef cppclass TestClassCpp:
int m_A

TestClass(int a):
m_A = a

void TestMethod():
print(m_A)

int ReturnTest():
return 1

为了测试,我创建了一个 Main 函数,我构建的脚本会调用该函数来自动编译代码。

cpdef int Main(str argv):
# Declare instance of Cython class and run tests
print("Python")
cdef TestClass t = TestClass(1)
t.test_method()
print(t.return_test())

# Declare instance of cppclass and run tests
print("C++")
cdef TestClassCpp* tc = new TestClass(1)
tc.TestMethod()
print(tc.ReturnTest())

return 0

我认为存在一些内存问题。我能够创建 C++ 类的实例,并且 ReturnTest() 可以工作,但是每当我打印 m_A 时,它都会打印出一个随机数,而不是应该在 m_A 中的那个。这使我相信问题可能出在构造函数中或出在从其他方法访问成员变量中。我这样做是为了尽我所能优化一切。所以我虽然 cppclass 可能比 class 快,但我没有这方面的证据。

最佳答案

忽略您的特定问题:我强烈建议不要这样做。

从 Cython 中创建一个 cppclass(与包装在 C++ 中创建的 cppclass 相对)几乎没有记录,您很可能会遇到错误。您在这里遇到的问题就是其中之一。还会有更多。

使用cdef 类 的一大优势是您可以从Python 与其进行交互。使用 cdef cppclass 你不能这样做,除非你随后将它包装在 cdef class 中(一旦你完成了,我们就进入了“毫无意义”)。

如果您想编写 C++ 代码,那么您通常最好用 C++ 编写它,然后在 Cython 中编写一个最小的包装器。用 Cython 编写它意味着您必须了解 Cython C++ 以及它们没有完全联系起来的所有地方。

最后,仔细考虑一下您要在这里实现的目标:

  • 如果答案是“我正在编写 C++,因此我认为它会更快”,那么这就是无稽之谈/“ cargo 崇拜编程”——您可以让 Cython 在常规函数中生成高效的 C 或 C++ 代码普通类(class)。
  • 如果答案是“我需要快速分配大量此类,而 Python 的引用计数开销正在成为一个问题”,那么这种方法可能是一个解决方案(但可能是不使用勉强支持的功能的其他选项)

旁注:

I created a Main function that is called by a script I built to automatically compile the code.

cpdef int Main(str argv):

这也是没有意义的。如果您从脚本中调用它,则只需使用常规的 def 函数即可。 cpdef 在这里没有任何好处,除非它被 Cython 非常频繁地调用。 cpdef 很少值得。

关于class - Cython:我可以使用 cppclass 而不是 class 吗?它有任何性能优势吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67032691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com