pickle cython class

后端 未结 3 1150
失恋的感觉
失恋的感觉 2021-01-02 06:20

I have to save and load a cython class instance. My cython class is this plus several methods:

import numpy as np
cimport numpy as np
cimport cython    
cdef         


        
3条回答
  •  南方客
    南方客 (楼主)
    2021-01-02 06:21

    I don't know if you found it, but the official Python documentation has a section on pickling extension types (unfortunately there doesn't seem to be a Python 3 version of this doc, but it works the same in Python 3).

    I think you have three problems here. Firstly, the function returned by __reduce__ is supposed to create a new object from scratch and return it, whereas your rebuild function just sets some attributes. Secondly, the tuple returned by __reduce__ must itself be picklable, and as a method, Perceptron_avg_my.rebuild is not picklable (I think this is expected to be fixed in python 3.3 or 3.4). Instead, you could turn it into a module-level function. Finally, the arguments (self.fpos,self.freePos) are passed to rebuild individually - you don't have to unpack the tuple yourself.

    The following seems to work for me (though you probably want to store the values of the other attributes too, otherwise they will just have the initial values set by __init__):

    #inside the class definition
    def __reduce__(self):
        return (rebuild, (self.wlen, self.fpos, self.freePos))
    
    #standalone function
    def rebuild(wlen, fpos, freePos):
        p = Perceptron_avg_my(wlen)
        p.fpos = fpos
        p.freePos = freePos
        return p
    

提交回复
热议问题