小编MS-*_*DOS的帖子

带有C指针的Pickle Cython类

我正在尝试为__reduce__()包含C指针的cython类编写一个方法,但迄今为止找到的关于最佳方法的信息很少.关于如何__reduce__()在将numpy数组用作成员数据时正确编写方法,有大量示例.我想远离Numpy数组,因为它们似乎总是存储为python对象,并且需要调用python API.我来自一个C的背景让我很舒服的工作内存使用手动将呼叫malloc()free(),我试图保持蟒蛇相互作用降到最低.

但是我遇到了一个问题.我需要copy.deepcopy()在Python脚本中使用与我正在创建的类相同的东西,最终将使用它.我发现执行此操作的唯一好方法是通过实现__reduce__()方法为类实现pickle协议.对于大多数原语或python对象来说,这是微不足道的.但是,对于如何为动态分配的C数组执行此操作,我绝对不知所措.显然我无法返回指针本身,因为底层内存在重建对象时会消失,那么最好的方法是什么?我确信这将需要修改__reduce__()方法以及一种或两种__init__()方法.

我已经阅读了关于这里发现的 pickle扩展类型的python文档,以及关于选择cython类(例如这个问题)的堆栈溢出的所有其他问题.

我的类的精简版看起来像这样:

cdef class Bin:
    cdef int* job_ids
    cdef int* jobs
    cdef int primitive_data

    def __cinit__(self):
        self.job_ids = <int*>malloc(40 * sizeof(int))
        self.jobs = <int*>malloc(40 * sizeof(int))

    def __init__(self, int val):
        self.primitive_data = val

    def __dealloc__(self):
        free(job_ids)
        free(jobs)

    def __reduce__(self):
        return (self.__class__, (self.primitive_data))
Run Code Online (Sandbox Code Playgroud)

python pointers pickle cython

6
推荐指数
1
解决办法
948
查看次数

返回的java数组值不正确

我是我大学java课程的助教,今天在实验室里,一名学生面对我一个非常奇怪的问题.我查看了大约一个小时,让实验室中的其他TA做同样的事,但我们找不到问题.

实际上我们在这里做的是创建3个数组,将它们传递给新方法.在新方法中修改那些数组的值并返回原始方法.我们没有使用return语句将任何数组返回到原始方法.相反,我们正在瞄准,我只能描述来自C背景作为传递参考.但是,在返回到原始方法时,值已更改为某些不正确的值.

在这个具体的例子中,我们有三个数组:"考试","测验"和"实验室".这些数组中的每一个都是大小为1,000并初始化为-1.在第一个方法"calcGrade"中,我们创建这些数组并初始化它们.然后我们将所有三个数组传递给第二个方法,该方法捕获用户拥有的考试,测验和实验室的数量,然后将实际考试,测验和实验室成绩值存储到数组中.

方法1(calcGrade)

exams            quizzes           labs
 -1                 -1              -1
 -1                 -1              -1
 -1                 -1              -1
 -1                 -1              -1
  .                  .               .
  .                  .               .
  .                  .               .
Run Code Online (Sandbox Code Playgroud)

方法2(getScores)

exams            quizzes           labs
 90                 80             90
-1                  80             90
-1                 -1              -1
-1                 -1              -1
 .                  .               .
 .                  .               .
 .                  .               .
Run Code Online (Sandbox Code Playgroud)

回到方法1(calcGrades)

exams            quizzes           labs
80                 90              90
-1                 -1              90
-1                 -1              -1
-1                 -1              -1
 .                  .               .
 .                  .               .
 .                  .               .
Run Code Online (Sandbox Code Playgroud)

任何人都可以想到这可能发生的任何原因吗?老实说我很难过,我不希望他因为一些似乎没有错的东西而失去信誉......

这是代码(请注意,有几个println语句用于调试目的): …

java arrays

0
推荐指数
1
解决办法
696
查看次数

标签 统计

arrays ×1

cython ×1

java ×1

pickle ×1

pointers ×1

python ×1