在Cython中处理复杂数字的正确方法是什么?
我想用dtype np.complex128的numpy.ndarray编写一个纯C循环.在Cython中,关联的C类型定义
Cython/Includes/numpy/__init__.pxd为
ctypedef double complex complex128_t
Run Code Online (Sandbox Code Playgroud)
所以看起来这只是一个简单的C双复合体.
但是,很容易获得奇怪的行为.特别是,有了这些定义
cimport numpy as np
import numpy as np
np.import_array()
cdef extern from "complex.h":
pass
cdef:
np.complex128_t varc128 = 1j
np.float64_t varf64 = 1.
double complex vardc = 1j
double vard = 1.
Run Code Online (Sandbox Code Playgroud)
这条线
varc128 = varc128 * varf64
Run Code Online (Sandbox Code Playgroud)
可以通过Cython编译,但gcc无法编译生成的C代码(错误是"testcplx.c:663:25:错误:声明说明符中的两个或更多数据类型",似乎是由于该行typedef npy_float64 _Complex __pyx_t_npy_float64_complex;).此错误已经报告(例如此处)但我没有找到任何好的解释和/或清洁解决方案.
没有包含complex.h,没有错误(我猜因为typedef那时不包括在内).
但是,仍然存在一个问题,因为在生成的html文件中cython -a testcplx.pyx,该行varc128 = varc128 * varf64是黄色的,这意味着它尚未被转换为纯C.相应的C代码是:
__pyx_t_2 = __Pyx_c_prod_npy_float64(__pyx_t_npy_float64_complex_from_parts(__Pyx_CREAL(__pyx_v_8testcplx_varc128), __Pyx_CIMAG(__pyx_v_8testcplx_varc128)), __pyx_t_npy_float64_complex_from_parts(__pyx_v_8testcplx_varf64, 0));
__pyx_v_8testcplx_varc128 …Run Code Online (Sandbox Code Playgroud) 我尝试在Windows 7下使用Cython和Python3(Anaconda3).通过编辑文件cygwinccompiler.py解决了distutils中的错误(参见在Windows 7下使用python 3.3(Anaconda)构建最小的cython文件),可以构建模块没有任何问题:
C:\path\testcython> python setup.py build
running build
running build_ext
cythoning testcython.pyx to testcython.c
building 'testcython' extension
C:\Prog\Anaconda3\Scripts\gcc.bat -mdll -O -Wall -IC:\Prog\Anaconda3\include -IC
:\Prog\Anaconda3\include -c testcython.c -o build\temp.win-amd64-3.4\Release\tes
tcython.o
writing build\temp.win-amd64-3.4\Release\testcython.def
C:\Prog\Anaconda3\Scripts\gcc.bat -shared -s build\temp.win-amd64-3.4\Release\te
stcython.o build\temp.win-amd64-3.4\Release\testcython.def -LC:\Prog\Anaconda3\l
ibs -LC:\Prog\Anaconda3\PCbuild\amd64 -lpython34 -lmsvcr100 -o build\lib.win-amd
64-3.4\testcython.pyd
Run Code Online (Sandbox Code Playgroud)
但是,只要.pyx文件中有import或print语句,生成的.pyd文件就会使Python崩溃.例如,如果testcython.pyx包含
def say_hello_to(name):
print('Hello '+name)
Run Code Online (Sandbox Code Playgroud)
它给
In [1]: import testcython # no crash here
In [2]: testcython.say_hello_to('Tom')
Hello Tom
Run Code Online (Sandbox Code Playgroud)
这里弹出"Python.exe已停止工作"窗口,它已经完成.
在那种情况下(没有错误日志崩溃,我猜想分段错误),我该怎么做才能理解这个问题?
有谁知道在Windows下使用Cython,Python 3(Anaconda3)会发生什么?
PS:Python 2.7(Anaconda)没问题.
编辑:模块faulthandler生成的跟踪
如果testcython.pyx只包含:
print('Test print... Will it …Run Code Online (Sandbox Code Playgroud) 当我尝试在Windows 7下使用Python 3.3(Anaconda 3)构建一个最小的Cython文件test.pyx时,我得到一个奇怪的错误:
C:\Users\myname\Test_cython>python setup.py build
running build
running build_ext
error: [WinError 2] The system cannot find the file specified
Run Code Online (Sandbox Code Playgroud)
当然test.pyx在工作目录中.它在使用Python 2.7(Anaconda)的Windows下运行,在Linux下使用Python 2和3运行良好.
Python 3.3(Anaconda 3)可能存在什么问题?
谢谢
文件setup.py:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
setup(
name = 'test',
cmdclass = {"build_ext": build_ext},
ext_modules = [Extension('test', ['test.pyx'])]
)
Run Code Online (Sandbox Code Playgroud)
解:
我发现包的文件cygwinccompiler.py的404行disutils
out_string = check_output(['gcc', '-dumpmachine'])
Run Code Online (Sandbox Code Playgroud)
必须改为
out_string = check_output(['gcc', '-dumpmachine'], shell=True)
Run Code Online (Sandbox Code Playgroud)
然后,它正常编译.
我有一个包含LabView程序的文件,需要了解它的作用.当然,没有LabView就无法执行.但是没有Labview可以阅读LabView程序吗?
使用Sphinx和reStructuredText,是否可以定义数学宏来在数学Latex公式中进行替换?
基本上,我想有类似的东西
.. |bnabla| replace:: :math:`\boldsymbol{\nabla}`
.. |vv| replace:: :math:`\textbf{v}`
.. math:: \rho \mbox{D}_t |vv| = - |bnabla| p + \rho \textbf{g} + \eta |bnabla|^2 |vv|,
where |vv| is the velocity and |bnabla| is the nabla operator.
Then follow many other equations with |vv| and |bnabla|...
Run Code Online (Sandbox Code Playgroud)
但它根本不起作用.首先,在数学模式中不替换标志,其次,即使它们被替换,:math:语句也不能在.. math::块中起作用.在Sphinx中改变这两种行为是不是一个好主意而不是复杂化?
另一种解决方案是使用乳胶宏,就像在这个问题中在Sphinx中创建LaTeX数学宏一样,但我认为最终的代码在我的例子中用本地第一个替换更简单.我想有明确的公式,也可以在文本模式下阅读.
此外,我使用MathJax扩展,所以我不能使用变量pngmath_latex_preamble.我可以将这个解决方案用于MathJax /sf/answers/1348798461/,但它似乎相当复杂,并且再一次使用"本地"第一次替换,代码会更清晰.
我意识到,对于许多人来说,mathmacro直接在reStructuredText中实现替换指令是非常方便和有用的(即在Python包docutils中).新指令应该像这样工作:
定义:
.. |bnabla| mathmacro:: \boldsymbol{\nabla}
.. |vv| mathmacro:: \textbf{v}
Run Code Online (Sandbox Code Playgroud)
这些数学宏可以直接包含在文本中,如下所示
|bnabla| is the nabla …Run Code Online (Sandbox Code Playgroud) 我使用Sphinx和autosummary来生成Python软件的文档.它运行良好但生成的.rst文件还列出了导入的函数和类,这不是我想要的行为.
例如,带有docstring的包"packageex":
"""
Package Example (:mod:`packageex`)
==================================
.. currentmodule:: packageex
.. autosummary::
:toctree:
module0
module1
"""
Run Code Online (Sandbox Code Playgroud)
会产生一个文件packageex.module0.rst
Module0 (:mod:`packageex.module0`)
=================================
.. currentmodule:: packageex.module0
.. rubric:: Functions
.. autosummary::
f0
f1
f2_imported
f3_imported
.. rubric:: Classes
.. autosummary::
Class0
ClassImported
Run Code Online (Sandbox Code Playgroud)
有没有办法只列出模块中定义的函数和类(而不是那些导入的函数和类)?
在autodoc文档(http://sphinx-doc.org/latest/ext/autodoc.html)中,"在一个自动模块指令中设置了成员选项集,只有模块成员的__module__属性等于模块名称为将记录给自动模块.这是为了防止导入的类或函数的文档.如果要防止此行为并记录所有可用成员,请设置imported-members选项.请注意,导入模块的属性将不会记录,因为属性通过解析当前模块的源文件来发现文档." 是否有可能通过autosummary获得相同的行为?
能够更新生成的虚拟环境并virtualenv --system-site-packages /path/to/myvirtenv考虑到基础Python中已完成的更改将非常方便.
例如,如果已经在virtualenv中安装了IPython 2.4并且后来在基础Python中安装了IPython 3.0,则应该从虚拟环境中删除旧的IPython,并替换为较新的包的副本.
我们应该怎么做?是否已经有命令这样做?如果没有,是否可以在virtualenv包中实现它?
PS:使用--system-site-packages选项生成的虚拟环境非常方便,如果你没有管理员权限,但如果对基础Python的任何修改使虚拟env错误,它似乎不是一个好方法!
PS:这个问题与virtualenv没有找到更新模块这个问题有关.
这个Julia函数似乎效率很低(比同等的Pythran/C++代码慢一个数量级,即使在Julia热身之后)......
function my_multi_broadcast(a)
10 * (2*a.^2 + 4*a.^3) + 2 ./ a
end
arr = ones(1000, 1000)
my_multi_broadcast(arr)
Run Code Online (Sandbox Code Playgroud)
我想这只是我没有正确地写出来......如何在朱莉娅加速这样的"多重广播"?我想/希望我不需要花费循环......
谢谢!通过我的设置,Pythran解决方案(就地和不合适)仍然快1.5到2倍(没有OpenMP).有没有办法在Julia中激活SIMD指令?或者另一种加速这种CPU计算的方法?
Python代码:
from transonic import jit
@jit
def broadcast(a):
return 10 * (2*a**2 + 4*a**3) + 2 / a
@jit
def broadcast_inplace(a):
a[:] = 10 * (2*a**2 + 4*a**3) + 2 / a
Run Code Online (Sandbox Code Playgroud)
@simd建议后编辑似乎@simd开箱即用,即只是在行的开头添加它.
ERROR: LoadError: LoadError: Base.SimdLoop.SimdError("for loop expected")
Stacktrace:
[1] compile(::Expr, ::Bool) at ./simdloop.jl:54
[2] @simd(::LineNumberNode, ::Module, ::Any) at ./simdloop.jl:126
[3] include at ./boot.jl:317 …Run Code Online (Sandbox Code Playgroud)