小编pau*_*ier的帖子

Cython中的复数

在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)

c python numpy cython complex-numbers

39
推荐指数
1
解决办法
3954
查看次数

Python崩溃与最小的Cython模块(Python3,Anaconda3,Windows7)

我尝试在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)

cython windows-7 python-3.x anaconda

15
推荐指数
1
解决办法
1031
查看次数

在Windows 7下使用python 3.3(Anaconda)构建最小的cython文件

当我尝试在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)

然后,它正常编译.

cython windows-7 python-3.x anaconda

8
推荐指数
1
解决办法
2141
查看次数

阅读没有LabView的LabView程序

我有一个包含LabView程序的文件,需要了解它的作用.当然,没有LabView就无法执行.但是没有Labview可以阅读LabView程序吗?

labview

6
推荐指数
3
解决办法
1万
查看次数

reStructuredText和Sphinx中的Math Latex宏

使用SphinxreStructuredText,是否可以定义数学宏来在数学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)

python latex restructuredtext python-sphinx

5
推荐指数
1
解决办法
1351
查看次数

带有toctree的sphinx autosummary还列出了导入的成员

我使用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获得相同的行为?

python python-sphinx

4
推荐指数
1
解决办法
2076
查看次数

更新Python virtualenv?

能够更新生成的虚拟环境并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没有找到更新模块这个问题有关.

python virtualenv

3
推荐指数
1
解决办法
1万
查看次数

如何在Julia中加速多个广播

这个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)

julia pythran

2
推荐指数
1
解决办法
181
查看次数