我从未使用过Cython,但我需要加密我的源代码。
我的问题是,如何将包含df.query("foo=@bar")等行的python文件转换为Cython。
如何复制此错误:
foo.py
import pandas as pd
bar=1
df=pd.DataFrame([1,2,3,4,5],columns=['test'])
print(df.query("test==@bar"))setup.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [
Extension("sample_code", ["foo.py"]),
]
setup(
name = 'My Program',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules
)然后,运行python setup.py build_ext --inplace
from sample_code import foo我得到了错误:pandas.core.computation.ops.UndefinedVariableError: local variable 'bar' is not defined
发布于 2020-06-29 07:32:44
正如@hpaulj在评论中所说:@bar将无法工作,因为它使用Python机制来查找调用者的字典。Cython不生成信息。
基于the documentation for DataFrame.Eval,您可以传递关键字参数locals_dict或globals_dict。所以你可以这样做:
df.query("test==@bar", locals_dict={'bar': bar})或
df.query("test==@bar", locals_dict=locals())值得强调的是,简单地将其放在Cython文件中没有任何性能优势。性能将取决于Pandas的性能,并且您已经编译了调用Pandas的文件,这一点都没有区别。
在您的情况下,它还提供了有限的“加密”优势--字符串"test==@bar"肯定可以在编译的Cython文件中找到。
https://stackoverflow.com/questions/62630646
复制相似问题