关于Python优化和-O或PYTHONOPTIMIZE有什么作用?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于as命令在Python3.x中有什么作用?、C++比Python快50倍
关于Python优化和-O或PYTHONOPTIMIZE有什么作用?的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于as命令在Python 3.x中有什么作用?、C++比Python快50倍?如何让C++和Python优势互补?(Boost::Python)、Python / Scipy – 将optimize.curve_fit的sigma实现到optimize.leastsq中、Python continue语句有什么作用?详解 Python continue语句的用法等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- Python优化(-O或PYTHONOPTIMIZE)有什么作用?(python 优化)
- as命令在Python 3.x中有什么作用?
- C++比Python快50倍?如何让C++和Python优势互补?(Boost::Python)
- Python / Scipy – 将optimize.curve_fit的sigma实现到optimize.leastsq中
- Python continue语句有什么作用?详解 Python continue语句的用法
Python优化(-O或PYTHONOPTIMIZE)有什么作用?(python 优化)
该文档只说Python解释器执行“基本优化”,而没有涉及任何细节。显然,它取决于实现,但是有什么方法可以使您优化哪种类型的东西,以及可以节省多少运行时间?
使用-O有什么缺点吗?
我唯一知道的是-O disables assert
,但大概不应该将它assert
用于生产中仍然可能出错的事情。
答案1
小编典典要验证不同版本的CPython的效果,请grep的源代码Py_OptimizeFlag
。
链接到官方文档:https : //docs.python.org/2.7/tutorial/modules.html#compiled-python-
files
as命令在Python 3.x中有什么作用?
我已经看过很多次了,但从未理解该as
命令在Python 3.x中的作用。能用简单的英语解释吗?
答案1
小编典典它本身不是命令,它是with
语句中使用的关键字:
with open("myfile.txt") as f: text = f.read()
之后,为对象 as
分配由with
上下文管理器处理的表达式的结果。
另一个用途是重命名导入的模块:
import numpy as np
因此您可以使用名称np
代替numpy
现在。
第三种用途是使您可以访问Exception
对象:
try: f = open("foo")except IOError as exc: # Now you can access the Exception for more detailed analysis
C++比Python快50倍?如何让C++和Python优势互补?(Boost::Python)
目录
- 1 为什么需要多语言联合编程?
- 2 Python调用C++的主要方式
- 2.1 SWIG
- 2.2 Boost::Python
- 2.3 ctypes
- 3 Boost::Python安装
- 4 测试实例:python继承C++接口
- 5 常见问题
- 6 参考文档
1 为什么需要多语言联合编程?
在大型工程项目中,经常会遇到多语言联合编程的情况,举个例子:
在一个远端控制系统中,前端Web使用html+css+js;后端采用python-flask作为服务端,底层控制采用C/C++
这是因为不同编程语言有各自的适用场景和语法特性,联合编程可使得各种语言发挥自己的特长。本文主要比较Python和C++,先列举各自特点如下:
对比项目 | C++ | Python |
---|---|---|
本质 | 编译型语言 | 解释型语言 |
编程难度 | 难以掌握 | 易于上手 |
语法特性 | 静态 | 动态 |
垃圾回收 | 不支持 | 支持 |
安装 | 易 | 难(需要专门打包) |
数据类型 | 在编译时由关键字确定 | 在运行时由数值确定 |
函数 | 输入参数和返回值类型有限制 | 输入参数和返回值类型无限制 |
执行速度 | 快 | 慢 |
性能 | 高 | 低 |
国外有一个测试指出在相同复杂度算法中,C++约比Python快50倍左右。因此Python不适合用于底层算法的开发,应用在上层应用中作粘合剂或进行智能领域的研究比较占优;C/C++则适合用于底层控制算法编程。下面主要介绍Python调用C++,让C++和Python形成优势互补。
2 Python调用C++的主要方式
主要介绍三种C++/Python联合编程的方式:
2.1 SWIG
- 支持Python、Java、Ruby等语言调用C接口
- 文档全面,易于学习
- 绑定性能欠佳, 不支持属性和内部类封装
- C++支持不好
2.2 Boost::Python
- 支持Python2与python3调用C++接口
- 大量使用C++ templates,明显提高编译时间
- 非常可靠、稳定、经过充分测试
- 语法较复杂,且文档不详细
本文采用Boost::Python
进行C++/Python联合编程。
2.3 ctypes
- 灵活,完全兼容C语言
- 使用较繁琐且不支持C++特性
3 Boost::Python安装
打开参考中的官方下载地址,根据不同的操作系统平台下载boost
,UNIX和Windows的安装流程差不多,下面以Windows系统为例说明安装过程。
按下面步骤安装编译
Boost::Python
- 下载最新的
boost_1_79_0.zip
并解压到本地目录 - 运行
bootstrap.bat
在目录下产生b2.exe
可执行文件 - 进入根目录新建
user-config.jam
用户配置文件,存放本地C++/Python信息
其中using msvc : 14.2; using python : 3.7.5 : "D:/Anaconda/Anaconda/envs/test/python.exe" : "D:/Anaconda/Anaconda/envs/test/include" : "D:/Anaconda/Anaconda/envs/test/libs";
msvc
是Visual Studio
对应的msvc toolset
版本,具体对应关系如下:python
则定义了本地使用的python
解释器相关路径和库 - 命令行执行自动化安装:
其中一些关键参数解释如下:b2 --with-python install --prefix="D:/3rdLib/boost/boost_1_79_0/bin/lib64-msvc-14.2" toolset=msvc-14.2 link=static address-model=64 --user-config=user-config.jam
-
with-
|without-
:前者后接要编译的Boost库名,如本文中只需编译Boost下的Python库;后者即为编译除之外的所有库,缺省则为全部编译 -
stage
|install
:前者表示只生成库文件(.dll与.lib),后者会额外生成include目录包含库文件对应的头文件,推荐使用stage
,因为安装完成后根目录下的boost
与include目录文件完全一致,可直接作为头文件使用,节省编译时间 -
stagedir
|prefix
:表示编译生成文件的路径,前者对应stage
安装模式,后者对应install
安装模式。建议在根目录下新建bin
目录管理生成的库文件# VS2019编译的x86库文件 bin/lib32-msvc-14.2 # VS2019编译的x64库文件 bin/lib64-msvc-14.2
-
toolset
:表示编译器,可选gcc
、msvc-14.2
(VS2019)等 -
link
:指定生成动态链接库shared
还是静态链接库static
,推荐使用静态库方式编译,这样发布程序时无需连带发布Boost的.dll文件,本文采用静态编译。 -
address-model
:指定编译版本,可选32
|64
,该参数必须和本地安装的Python位数相对应,否则会编译出错 -
user-config
:使用的本地用户配置文件路径
-
补充一下编译库文件的命名格式:
libboost_python37-vc142-mt-gd-x64-1_79
| || | | | | | || ||| | | | |
- --- ------ --- -- - - - --
1 2 3 4 5 6 7 8 9
- 静态库以
lib
开头,动态库没有lib
前缀 -
boost::python
库名称和版本 - 编译器名称及版本
-
mt
代表threading=multi
,没有则代表threading=single
-
s
代表runtime-link=static
,没有则代表runtime-link=shared
-
gd
代表debug
版本,没有则代表release
版本 -
x32
代表32 位程序,x64
代表64 位 - Boost库版本,
1_79
代表Boost 1.79版本。
4 测试实例:python继承C++接口
新建工程文件夹,包含三个文件helloworld.cpp
、helloworld.py
与CMakeLists.txt
在helloworld.cpp
中编写:
// 因为采用静态编译boost库,因此必须定义此宏,否则编译出错
#define BOOST_PYTHON_STATIC_LIB
#include<boost/python.hpp>
#include<boost/python/wrapper.hpp>
#include<string>
#include<iostream>
using namespace boost::python;
using namespace std;
struct Base
{
virtual ~Base() {}
virtual int f() { return 0; };
};
struct BaseWrap : Base, wrapper<Base>
{
int f()
{
if (override f = this->get_override("f"))
return f(); //如果函数进行重载了,则返回重载
return Base::f(); //否则返回基类
}
int default_f() { return this->Base::f(); }
};
BOOST_PYTHON_MODULE(hello)
{
class_<BaseWrap, boost::noncopyable>("Base")
.def("f", &Base::f, &BaseWrap::default_f);
}
在CMakeLists.txt
中编写编译规则
project(Boost_Test)
cmake_minimum_required(VERSION 2.8.3)
if(MSVC)
# set(Boost_USE_STATIC_LIBS ON)
set(Boost_DIR D:/3rdLib/boost/boost_1_79_0/stage/lib/cmake/Boost-1.79.0)
set(PYTHON_INCLUDE_Dirs D:/Anaconda/Anaconda/envs/test/include)
set(PYTHON_LIBRARIES D:/Anaconda/Anaconda/envs/test/libs/python37.lib)
find_package(Boost 1.79.0 CONfig COMPONENTS python required)
include_directories(${Boost_INCLUDE_DIR} ${PYTHON_INCLUDE_Dirs})
endif(MSVC)
set(MODULE_NAME hello)
add_library(${MODULE_NAME} SHARED
helloword.cpp
)
if (UNIX)
set_target_properties(${MODULE_NAME}
PROPERTIES
PREFIX ""
)
elseif (WIN32)
set_target_properties(${MODULE_NAME}
PROPERTIES
SUFFIX ".pyd"
)
endif()
target_link_libraries(${MODULE_NAME}
${Boost_LIBRARIES}
${PYTHON_LIBRARIES}
)
在工程目录下执行以下命令行:
mkdir build
cd build
cmake ..
make
即可编译出hello.pyd
二进制文件,将该文件置于工程目录下(与helloworld.py
在同一个目录),在helloworld.py
中导入接口,测试多态:
import hello
base = hello.Base()
# 定义派生类,继承C++类
class Derived(hello.Base):
def f(self):
return 42
derived = Derived()
print( base.f())
print (derived.f())
输出以下内容,证明实验成功
>>> 0
>>> 42
5 常见问题
-
#include <boost\python.hpp>无法打开源文件'pyconfig.h'
解决方案:首先确保当前虚拟环境下有
pyconfig
,否则需要pip install
。接着对于vscode
,在c_cpp_properties.json
中添加python的include
目录 -
error LNK2019: 无法解析的外部符号 "__declspec(dllimport) class boost::python::xxx
解决方案:库链接出错,对于静态编译的Boost::python库需要在C++文件中声明静态编译宏
#define BOOST_PYTHON_STATIC_LIB
6 参考文档
- Boost::Python官方文档
- Boost::Python下载官网
Python / Scipy – 将optimize.curve_fit的sigma实现到optimize.leastsq中
现在我切换到了最小化,因为我还需要一些曲率拟合无法提供的拟合优度估计.一切都运作良好,但现在我错过了权衡最小平方的可能性,因为“sigma”与curve_fit有关.
有人一些代码示例关于我如何在最小方格中加权最小二乘?
谢谢,Woodpicker
解决方法
popt,pcov,infodict,errmsg,ier = curve_fit(func,xdata,ydata,sigma = SD,full_output = True)
这给了我infodict,我可以用来计算我所有的fitness of Fit,并让我同时使用curve_fit的sigma选项……
Python continue语句有什么作用?详解 Python continue语句的用法
本文主要介绍python语句,python continue 语句跳出本次循环,而break跳出整个循环。continue 语句用来告诉python跳过当前循环的剩余语句,然后继续进行下一轮循环。continue语句用在while和for循环中。
Python 语言 continue 语句语法格式如下:
continue
流程图:
实例:
#!/usr/bin/python # -*- coding: UTF-8 -*- for letter in 'Python': # 第一个实例 if letter == 'h': continue print '当前字母 :', letter var = 10 # 第二个实例 while var > 0: var = var -1 if var == 5: continue print '当前变量值 :', var print "Good bye!"
以上实例执行结果:
立即学习“Python免费学习笔记(深入)”;
当前字母 : P
当前字母 : y
当前字母 : t
当前字母 : o
当前字母 : n
当前变量值 : 9
当前变量值 : 8
当前变量值 : 7
当前变量值 : 6
当前变量值 : 4
当前变量值 : 3
当前变量值 : 2
当前变量值 : 1
当前变量值 : 0
Good bye!
与本文相关的知识点:
希望本文,能对您在工作中,起到帮助的作用
以上就是Python continue语句有什么作用?详解 Python continue语句的用法的详细内容,更多请关注php中文网其它相关文章!
我们今天的关于Python优化和-O或PYTHONOPTIMIZE有什么作用?的分享就到这里,谢谢您的阅读,如果想了解更多关于as命令在Python 3.x中有什么作用?、C++比Python快50倍?如何让C++和Python优势互补?(Boost::Python)、Python / Scipy – 将optimize.curve_fit的sigma实现到optimize.leastsq中、Python continue语句有什么作用?详解 Python continue语句的用法的相关信息,可以在本站进行搜索。
本文标签: