3

我目前正在使用 PyCall 将基于 LZ-77 的用于数据压缩的 Python 库加载到 Julia 中。python 库是sweetsourcod,我将它安装在我的主目录中。在该库中,我使用模块 lempel_ziv 进行一些熵测量。我按照PyCall 的示例加载 python 模块。这就是我将它加载到 Julia 中的方式:

using PyCall

sc = pyimport("sweetsourcod.lempel_ziv")

PyObject <module 'sweetsourcod.lempel_ziv' from '/Users/danielribeiro/sweetsourcod/sweetsourcod/lempel_ziv.cpython-38-darwin.so'>

这个 python 库的使用似乎在 Julia 中造成了分段错误;但是,当我在 python 中编写相同的代码时,不会发生分段错误。以下 Julia 示例触发分段错误

using PyCall

L = 1000000
nbins = [2*i for i = 1:2:15]
sc = pyimport("sweetsourcod.lempel_ziv")
# loop through all n
for n in nbins
    # loop through all configurations
    for i = 1:65
        # analogous to reading a configuration from scratch
        config = rand(0:255, L)
        # calculate entropy
        # 1.1300458785794484e6 --> cid of random sequence of same L
        entropy = sc.lempel_ziv_complexity(config, "lz77")[2] / 1.1300458785794484e6
    end
end

该行entropy = sc.lempel_ziv_complexity(config, "lz77")[2] / 1.1300458785794484e6 是触发段错误的原因。这是我能够在 Julia 中编写以生成段错误的最小工作示例。该函数lempel_ziv_complexity() 压缩数组并返回一个包含 LZ 因子和压缩文件的近似大小的元组。当我在 Python 中编写相同的代码时,不会触发段错误。这是 Python 中的工作示例

import numpy as np
from sweetsourcod.lempel_ziv import lempel_ziv_complexity

L = 1000000
nbins = [2*i for i in range(1, 15, 2)]

for n in nbins:
    for i in range(1, 65, 1):
        config = np.random.randint(0, 256, L)
        entropy = lempel_ziv_complexity(config, "lz77")[1] / 1.1300458785794484e6

我怀疑段错误的触发与我不熟悉的 PyCall 的内部结构有关。我还尝试将 sweetsourcod 预编译到一个模块中,就像PyCall 的 README中建议的那样。有人对如何解决这个问题有任何建议吗?先感谢您!

4

0 回答 0