Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我应该如何在Cython中使用'round()'函数?_Python_Cython - Fatal编程技术网

Python 我应该如何在Cython中使用'round()'函数?

Python 我应该如何在Cython中使用'round()'函数?,python,cython,Python,Cython,----------更新------------------------- 找到了一些光 这样做的缺点是官方的64位Python构建没有附带libmsvcr90.a,我们需要将其与正确的C运行时DLL链接 -----------原职------------------- 我的Python版本: Python 3.3.5,在Windows中使用MSC v.1600 64位。已安装并使用Windows SDK v7.1。我已经和Cython一起工作了一个星期,它似乎可以很好地运行其他代码 在本文中,

----------更新-------------------------

找到了一些光

这样做的缺点是官方的64位Python构建没有附带libmsvcr90.a,我们需要将其与正确的C运行时DLL链接

-----------原职-------------------

我的Python版本:

Python 3.3.5,在Windows中使用MSC v.1600 64位。已安装并使用Windows SDK v7.1。我已经和Cython一起工作了一个星期,它似乎可以很好地运行其他代码

在本文中,它说
round()
是内置函数之一。但是,当我在cython代码中调用它并使用
cython my_code.pyx-a
进行检查时,该函数是纯黄色的,这意味着使用了python方法

然后我做了一些谷歌搜索,并使用:

来自libc.math cimport round

但它在编译过程中称为“未解析的外部符号”

我该怎么办

代码如下:

from libc.math cimport round

cdef float a = 1.5
cdef float b

b = round(a)
print(b)
上面写着:致命错误LNK1120:1未解决的外部错误

My setup.py:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
import numpy as np

extensions = [
    Extension('test', ['test.pyx'], include_dirs = [np.get_include()]),
    ]

setup(
    ext_modules = cythonize(extensions)
    )
我知道np.get_include()在这种情况下确实是不必要的,但我只是添加了它们,因为我太频繁地使用numpy了,而且对这种情况也不会有太大影响

我的编译命令:

python setup.py build_ext --inplace
结果(我在我的机器上实际使用了setup1.py):

X:\WorkFolder\DataAnalysis\lw9pg\mol>python setup1.py build\u ext--inplace 正在运行内部版本\u ext
构建“测试”扩展
C:\ProgramFiles(x86)\Microsoft Visual Studio 10.0\VC\Bin\amd64\cl.exe/C/nologo/Ox/MD/W3/GS-/DNDEBUG-IX:\WinPython3\python-3.3.5.amd64\include-IX:\WinPython3\python-3.3.5.amd64\include/Tctest.C/Fobuild\temp.win-amd64-3.3\Release\test.obj
测试c
C:\ProgramFiles(x86)\Microsoft Visual Studio 10.0\VC\Bin\amd64\link.exe/DLL/nologo/INCREMENTAL:NO/LIBPATH:X:\WinPython3\python-3.3.5.amd64\libs LIBPATH:X:\WinPython3\python-3.3.5.amd64\PCbuild\amd64/EXPORT:PyInit\u test build\temp.win -amd64-3.3\Release\test.obj/OUT:X:\WorkFolder\DataAnalysis\lw9pg\mol\test.pyd/IMPLIB:build\temp.win-amd64-3.3\Release\
test.lib/MANIFESTFILE:build\temp.win-amd64-3.3\Release\test.pyd.manifest
test.obj:警告LNK4197:多次指定导出'PyInit_test';使用第一个规范
创建库build\temp.win-amd64-3.3\Release\test.lib和对象build\temp.win-amd64-3.3\Release\test.exp
test.obj:错误LNK2019:函数\uuuu pyx\u pf\u 4test\u舍入中引用的未解析外部符号舍入
X:\WorkFolder\DataAnalysis\lw9pg\mol\test.pyd:致命错误LNK1120:1未解析的外部
错误:命令“C:\Program Files(x86)\Microsoft Visual Studio 10.0\VC\Bin\amd64\link.exe”失败,退出状态为112

0

如果要测试简单的cython代码,最简单的方法是使用
pyximport

要运行您的代码,假设代码所在的文件名为
tester.pyx

在同一个目录中,将其放在python文件的顶部,然后运行该文件,您将看到您的
print b
将输出
2.0

import pyximport
pyximport.install()
要编译和运行cython函数,我使用以下setup.py脚本:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext= Extension("tester", sources=["tester.pyx"])
setup(ext_modules=[ext],cmdclass={'build_ext': build_ext})
使用以下命令在
.pyx
文件上运行它,
--inplace
将其编译为相同的目录:

python setup.py build_ext --inplace --compiler=mingw32 # --compiler=mingw32 only needed on windows
您将有一个(
tester.pyd
)(mac和linux上的tester.so)文件,您可以从中导入函数,就像它们来自python模块一样

这是一个简单的函数,用于对数字进行舍入:

from libc.math cimport round

def rounding(float n):
    return round(n)
编译它或使用
pyxinstall
导入并运行它,就像:

In [29]: from tester1 import *

In [30]: rounding(12.3453455)
Out[30]: 12.0
使用pyximport:

In [21]: import pyximport

In [22]: pyximport.install()
Out[22]: (None, None)
         from tester import *
In [23]: rounding(10.23232)
Out[23]: 10.0
我创建了一个纯python舍入方法来比较:

def py_rounding(n):
    return round(n)

import timeit
if __name__=='__main__':
    print timeit.timeit('py_rounding(10.23232)','from cyt import py_rounding')
    print timeit.timeit('rounding(10.23232)','from tester import rounding')
    0.183354854584
    0.037761926651
cython
代码要快得多

这些都是非常基本的例子,你可以找到cython更好的用途
包括使用ipython加载cythonmagic
和ipython

你是如何使用它的?@PadraicCunningham谢谢你的回复!我马上就发代码。我忘了做那件事。。。抱歉。那么你正在编译你发布的内容?@Padraiccningham是的,我是。但我还没有尝试过ipython魔术。我不确定问题是什么:你链接的文档确实说,
round
可用,但同一段说,
enumerate
slice
也可用。说命名空间中有内置函数与C版本不同。谢谢你!我知道如何编译Cython,您的回答似乎表明上面的代码在您的Python上可以顺利编译。。。这是真的吗?我认为这可能与Windows7上的Python3和64位有关。我在OP上附加了我的setup.py。您的代码使用python2.7和3.4使用我的setup.py脚本可以很好地编译。您是否尝试过使用我的脚本或
--complier=mingw32
,我觉得windows需要它?使用setup.py它也可以很好地编译