微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Julia 的 PyCall 包生成分段错误

如何解决Julia 的 PyCall 包生成分段错误

我目前正在使用 PyCall 将基于 LZ-77 的用于数据压缩的 Python 库加载到 Julia 中。 python 库是 sweetsourcod,我将它安装在我的主目录中。在那个库中,我使用模块 lempel_ziv 进行一些熵测量。我在 PyCall's example 之后加载了 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's README 中建议的那样。有没有人对如何解决这个问题有任何建议? 提前致谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。