1、CPython
是Python语言规范的参考实现,能够优先获得Python语言的最新、最强的功能,CPython是由C语言编写而成,不但可以从Python代码中调用C代码的函数,还可以直接在Python中使用大量现有的C代码库。
2、Brython
Brython可用于在浏览器中运行包含了Python 3脚本的Web应用。
3、PyPy Python
虽然第一个推荐的是在Python中使用最广泛的编译器,但却不是最快的,PyPy采用的是即时的编译概念,在代码执行前,就直接编译为机器代码,因此其执行速度提高了近4倍。
4、Jython或JPython
使用率第二高,Jython最初被称为JPython,是通过Python语言来实现Java虚拟机的,开发者既可以将现有的Java包和代码库,导入自己的Python程序中,还可以在Java程序中嵌入Python脚本。
5、Cython
Cython与CPython不同,更像是一个超集,允许开发者在代码中结合C和Python,从而生成C语言代码类型的输出,以供任何一种C/C++编译器进行后续编译。
6、Skulpt
流行的速度非常快,主要目的是提供一种良好的在线式Python编译器,也可以通过让Web应用引擎包含Skulpt,以方便开发者编写出被用于前端的Python脚本。
7、PyJS
是另一款完全用Python去开发Web应用的编译工具,在后台,PyJS会在使用内置的Ajax框架之前,将Python代码编译为JavaScript。
8、WinPython
是Python的"即用型"发行版,也就意味着用户无需安装,即可在Windows
PC上运行,作为另一种Python的实现,WinPython编译器不仅带来了Python执行环境,而且还包含了诸如:Scipy、Numpy、以及Pandas等各种Python库。
‘贰’ python是编译器还是解释器
其实Python和Java/C#一样,也是一门基于虚拟机的语言
Python是编译+解释型的语言,执行的时候是由Python解释器,逐行编译+解释,然后运行,因为在运行的过程中,需要编译+解释,所以Python的运行性能会低于编译型语言,比如C++。为了提高性能,Python解释器,会将模块(以后要重用的脚本文件放在模块里)的编译+解释的结果,保存在.pyc中。这样下次执行的时候,就省了编译这个环节。提高性能。一次性的脚本文件,解释器是不会保存编译+解释的结果,也就是没有.pyc文件。
希望这个回答可以帮助到你。
‘叁’ python编译器怎么跟mingw installer 安装的关联起来
使用MinGW 编译python扩展模块
MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,
允许你生成本地的Windows程序而不需要第三方C运行时库。说白了就是在windows环境下
提供一套GNU工作环境。
1、下载mingw-get
下载地址
2、 安装gcc
mingw-get install gcc
3、安装mingw32-make
mingw-get install mingw32-make
4、添加mingw/bin到path变量中
5、指定编译器为mingw32
python setup.py build -c mingw32 install
python setup.py build --complier=mingw32 install
或者修改site.cfg中添加或修改
[build]
compiler = mingw32
或者在lib\distutils\distutils.cfg添加或修改
[build]
compiler = mingw32
上面几种方结果一样只是操作过程中影响的范围不同而已.
‘肆’ 为什么编译的Python模块,但不是脚本正在运行
文件是在导入编译。 这不是一个安全的事情。 这仅仅是如果你将其导入蟒蛇保存输出。 看到这个帖子由Fredrik Lundh开发上Effbot。
>>>import main
# main.pyc is created
当运行一个脚本巨蟒将不使用* .pyc文件的文件。 如果你有你想要你的脚本一些其他的原因,预编译可以使用compileall模块。
python -m compileall .
compileall用法
python -m compileall --help
option --help not recognized
usage: python compileall.py [-l] [-f] [-q] [-d destdir] [-x regexp] [directory ...]
-l: don't recurse down
-f: force rebuild even if timestamps are up-to-date
-q: quiet operation
-d destdir: purported directory name for error messages
if no directory arguments, -l sys.path is assumed
-x regexp: skip files matching the regular expression regexp
the regexp is searched for in the full path of the file
回答以下问题编辑
如果响应是潜在的磁盘权限的目录main.py,为什么Python的编译模块?
模块和脚本将被视为相同。 进口是什么触发要保存的输出。
如果原因是好处将是最小的,可以考虑的情况时,该脚本将被用于大量的时间(诸如在一个CGI应用程序)。
使用compileall不解决这个问题。 由蟒蛇执行的脚本将不使用*.pyc,除非明确要求。 这有负面影响,深受格伦·梅纳德在他的回答说。
CGI应用程序的给出的例子确实应该使用像FastCGI的技术来解决。 如果你想消除编译脚本的开销,可能要消除启动蟒蛇太大,何况数据库连接开销的开销。
光引导脚本可以用来甚至python -c "import script",但这些都值得商榷的风格。
格伦·梅纳德提供一些灵感来纠正和改进这个答案。
似乎没有人想这样说,但我敢肯定的答案很简单:有这种行为没有坚实的理由。
所有到目前为止所提出的理由基本上是不正确的:
没有什么特别的主文件。 它作为一个模块加载,并显示了sys.moles像任何其他模块。 运行主脚本无非就是用的模块名称导入更__main__。
有与没有保存.pyc文件由于只读目录中的文件没有问题; 蟒蛇简单地忽略它,并在移动。
缓存脚本的好处是相同缓存任何模块的:不浪费时间每次它的运行时间重新编译脚本。 该文档明确地承认这一点(“因此,脚本的启动时间可能会减少......”)。
另一个问题需要注意:如果您运行python foo.py和foo.pyc存在,它不会被使用。你必须明确地说,python foo.pyc。 这是一个非常糟糕的主意:它意味着当它是不同步的Python不会自动重新编译的.pyc文件的文件(由于.py文件变化),因此对.py文件的更改将不会使用,直到您手动重新编译。 它也将与抛出一个RuntimeError彻底失败如果升级的Python和.pyc文件的文件格式不再兼容,这经常发生。 通常情况下,这是所有透明地处理。
你不应该需要一个脚本移动到一个虚拟的模块,并成立了引导脚本欺骗的Python到其高速缓存。 这是一个hackish的解决方法。
唯一可能(而且非常缺乏说服力)我之所以能凑合是避免从一堆pyc文件被杂乱的主目录。 (这不是真正的理由;如果这是一个实际的问题,则pyc文件应保存为点文件)。这当然没有理由不甚至有一个选项来做到这一点。
蟒绝对应该能够缓存主模块。
以来:
当它从.pyc文件或.pyo文件时,它是从一个.py文件阅读不是阅读程序不会跑得更快; 这是关于.pyc文件或.pyo文件的速度的唯一事情就是与它们加载速度。
这是不必要的,以产生用于主脚本pyc文件的文件。 只有那些可能会被加载多次图书馆应编制。
编辑:
这似乎你没明白我的意思。 首先,认识到编制的整体思路.pyc文件也作出了同样的文件在第二次执行速度更快。 然而,考虑是否做的Python编译脚本正在运行。 解释器将字节码写入到一个.pyc的文件在第一次运行,这需要时间。 因此,它甚至会运行有点慢。 你可能会认为它会更快之后运行。 好吧,这只是一个选择。 此外,作为this说:
明确优于隐式。
如果想通过使用加速.pyc的文件,应该手动编译并运行.pyc明确文件。
要回答你的问题,参考6.1.3。 “编译”Python文件在Python正式文件。
当脚本由命令行上给出它的名字运行,脚本的字节码不会被写入一个.pyc文件或.pyo文件。 因此,脚本的启动时间可通过移动它的大部分代码的一个模块,并具有导入这个模块一小启动脚本减少。 另外,也可以命名.pyc文件或直接.pyo文件的命令行上。
教育学
让我又爱又恨类似这样的问题上如此,因为有感情,意见的复杂混合物,和受过教育的猜测事情,人们开始变得snippy,不知何故每个人都失去了赛道的实际情况,最终失去了轨道原题的共。
这么多的技术问题都至少有一个明确的答案,但这些“为什么”的问题往往没有只是一个单一的,确定的答案(例如,可以通过执行或引用权威人士的答案来验证答案)。 在我看来,有两个可能的方式来明确回答计算机科学“为什么”的问题:
通过指向一个实现所关注的项目的源代码。 这就解释了“为什么”从技术角度来看:什么前提条件是必要的,以唤起这种行为?
通过指向人类可读的文物(注释,提交信息,邮件列表等)由参与作出该决定的开发人员编写的。 这就是“为什么”,我假设OP是感兴趣的真正意义:为什么Python的开发人员使这种看似随意的决定?
第二种回答是更加难以证实,因为它需要获得在谁写的代码开发者的心,特别是如果没有容易找到,公开文件中的特定行为的决定。
迄今为止,这个讨论有7回答是只专注于阅读的Python的开发者的意图,但只有一个在整批引用。 (它引用了不回答OP的问题了Python手册的部分。)
这是我在与沿引用既回答了“为什么”的问题两侧的尝试。
源代码
什么是触发.pyc文件编制的前提条件? 让我们来看看源代码。 (烦人,在GitHub上Python没有发布任何标记,所以我就告诉你,我在寻找715a6e)。
有在希望的代码import.c:989在load_source_mole()函数。 我在这里切出一些位为简洁起见。
static PyObject *
load_source_mole(char *name, char *pathname, FILE *fp)
{
// snip...
if (/* Can we read a .pyc file? */) {
/* Then use the .pyc file. */
}
else {
co = parse_source_mole(pathname, fp);
if (co == NULL)
return NULL;
if (Py_VerboseFlag)
PySys_WriteStderr("import %s # from %s
",
name, pathname);
if (cpathname) {
PyObject *ro = PySys_GetObject("dont_write_bytecode");
if (ro == NULL || !PyObject_IsTrue(ro))
write_compiled_mole(co, cpathname, &st);
}
}
m = PyImport_ExecCodeMoleEx(name, (PyObject *)co, pathname);
Py_DECREF(co);
return m;
}
pathname是路径模块和cpathname是相同的路径,但是用pyc文件扩展名。 唯一的直接逻辑是布尔sys.dont_write_bytecode。 逻辑的其余部分就是错误处理。 因此,我们所寻求的答案不在这里,但我们至少可以看到,调用此的任何代码将导致在大多数默认配置的.pyc文件的文件。 该parse_source_mole()函数没有真正意义要执行的流程,但我会在这里显示,因为我会回来稍后。
static PyCodeObject *
parse_source_mole(const char *pathname, FILE *fp)
{
PyCodeObject *co = NULL;
mod_ty mod;
PyCompilerFlags flags;
PyArena *arena = PyArena_New();
if (arena == NULL)
return NULL;
flags.cf_flags = 0;
mod = PyParser_ASTFromFile(fp, pathname, Py_file_input, 0, 0, &flags,
NULL, arena);
if (mod) {
co = PyAST_Compile(mod, pathname, NULL, arena);
}
PyArena_Free(arena);
return co;
}
这里的显着的方面是,函数解析和编译的文件,并返回一个指针的字节代码(如果成功)。
现在,我们仍处于一个死胡同,让我们处理这个从一个新的角度。 如何Python中加载它的参数,并执行它? 在pythonrun.c有用于从文件加载代码并执行它的几个功能。PyRun_AnyFileExFlags()可以处理交互式和非交互式的文件描述符。 对于交互式的文件描述符,它委托给PyRun_InteractiveLoopFlags()这是REPL)和非交互式的文件描述符,它委托给PyRun_SimpleFileExFlags()PyRun_SimpleFileExFlags()检查文件名 中结束.pyc。 如果这样做的话,就调用run_pyc_file()直接加载编译字节码从一个文件描述符然后运行它。
在更常见的情况下(即.py文件作为参数),PyRun_SimpleFileExFlags()调用PyRun_FileExFlags()这是我们开始找到了答案。
PyObject *
PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
PyObject *locals, int closeit, PyCompilerFlags *flags)
{
PyObject *ret;
mod_ty mod;
PyArena *arena = PyArena_New();
if (arena == NULL)
return NULL;
mod = PyParser_ASTFromFile(fp, filename, start, 0, 0,
flags, NULL, arena);
if (closeit)
fclose(fp);
if (mod == NULL) {
PyArena_Free(arena);
return NULL;
}
ret = run_mod(mod, filename, globals, locals, flags, arena);
PyArena_Free(arena);
return ret;
}
static PyObject *
run_mod(mod_ty mod, const char *filename, PyObject *globals, PyObject *locals,
PyCompilerFlags *flags, PyArena *arena)
{
PyCodeObject *co;
PyObject *v;
co = PyAST_Compile(mod, filename, flags, arena);
if (co == NULL)
return NULL;
v = PyEval_EvalCode(co, globals, locals);
Py_DECREF(co);
return v;
}
这里的突出的一点是,这两个函数基本上执行相同的目的,进口商的load_source_mole()和parse_source_mole()它调用解析器创建从Python源代码的AST,然后调用编译器创建字节码。
那么,这些代码块多余的还是他们的目的不同? 不同的是,一个块加载从文件的模块,而其他块使用的是模块作为参数。该模块的说法是-在这种情况下-在__main__模块,它使用的是低级别的C函数早些时候在初始化过程中创建的。 该__main__模块不通过最正常的模块导入代码路径,因为它是如此独特,并且作为一个副作用,它不通过产生代码去.pyc的文件。
总结:为什么原因__main__。模块未编译.pyc文件是它是不是“进口”是的,它出现在sys.moles中,但它通过不是真正的模块导入采取了非常不同的代码路径到达那里。
开发者意图
好了,我们现在可以看到的行为更多的是与Python的设计比在源代码中任何明确表达的理由,但是这并没有回答这是否是一种有意的决定,或只是一个副作用的问题这不打扰任何人足以成为值得改变。 一个开源的好处是,一旦我们发现我们感兴趣的源代码,我们可以使用VCS帮助追溯,导致目前实施的决定。
其中代码的关键行这里(m = PyImport_AddMole("__main__");)的历史可以追溯到1990年,并在自己BDFL,圭多写的。 它已被修改,在干预的岁月,但修改是肤浅的。 当它第一次写,一个脚本参数主模块初始化是这样的:
int
run_script(fp, filename)
FILE *fp;
char *filename;
{
object *m, *d, *v;
m = add_mole("`__main__`");
if (m == NULL)
return -1;
d = getmoledict(m);
v = run_file(fp, filename, file_input, d, d);
flushline();
if (v == NULL) {
print_error();
return -1;
}
DECREF(v);
return 0;
}
这之前存在.pyc的文件甚至被引入到Python的! 难怪当时的设计没有考虑汇编成账户脚本参数。 提交信息神秘地说:
“编译”版本
这是几十的一个承诺,在3天的时间......看来,圭多是深入到一些黑客/重构,这是一回到是稳定的第一个版本。 这种承诺甚至五年左右早于Python的开发邮件列表的创建!
保存编译的字节码引入以后6个月,于1991年。
这仍然早于列表服务,所以我们有一个什么样圭多想没有真正的想法。 看来,他只是认为,进口商为挂接到缓存字节码的目的,最好的地方。 他是否考虑做同样为理念__main__不清:要么没有想到他,不然他认为这是更多的麻烦比它的价值。
我无法找到要缓存为主要模块的字节码相关的bugs.python.org任何错误,也可以找到关于它的邮件列表上的任何消息,因此,显然没有人认为这是值得的麻烦尝试添加它。
总结:为什么所有模块编译的缘故.pyc除了__main__是,它是历史的怪癖如何设计和实现。__main__被作品烤成代码前.pyc的文件,即使存在。 如果你想知道的多的是,你需要电子邮件圭多和要求。
格伦·梅纳德的回答说:
似乎没有人想这样说,但我敢肯定的答案很简单:有这种行为没有坚实的理由。
我同意100%。 有间接证据来支持这一理论,没有人在这个线程别人提供的证据来支持任何其他理论的一个切丝。 我upvoted格伦的回答。
因为剧本正在运行可能会在某处是不恰当的生成pyc文件,如/usr/bin。
‘伍’ 怎样下载python编译器
下载python编译器的方法:首先进入python官网,找到合适的版本进行下载;然后运行安装程序,设置安装路径,并选择将python添加到环境变量中;最后等待安装完成即可。
安装方法:
(推荐教程:Python入门教程)
首先进入官网,找到合适的版本下载。
然后运行安装程序,在Windows上面安装比较简单,就一直点下一步就可以了。
第一个框选是为所有用户安装,第二个框选的是将Python添加到环境变量
当选择allUser时会将python安装到 C:Program Files (x86)目录下面,否则是按照上面图片的位置安装。
最后打开控制台,执行python命令即可进入python环境。
‘陆’ Python编译器运行不了
这个绝了,这个是模块里报错了,可能是版本兼容问题,你改不明白源码的,我建议你如果是Python3就用urllib.request模块,Python2用urllib和urllib2
‘柒’ 学习Python建议用什么编译器
LLVM后端的numba和支持大部分C++编译器作为后端的nuitka。
Python由荷兰数学和计算机科学研究学会的Guido van Rossum于1990 年代初设计,作为一门叫做ABC语言的替代品。
Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
Python解释器易于扩展,可以使用C或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python 也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。
Python是一门跨平台的脚本语言,Python规定了一个Python语法规则,实现了Python语法的解释程序就成为了Python的解释器。
简单讲,编译器就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。
一个现代编译器的主要工作流程:源代码 (source code) →预处理器(preprocessor) → 编译器 (compiler) →目标代码(object code) →链接器(Linker) → 可执行程序(executables)。
高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。
源代码一般为高级语言 (High-level language), 如Pascal、C、C++、Java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。
对于C#、VB等高级语言而言,此时编译器完成的功能是把源码(SourceCode)编译成通用中间语言(MSIL/CIL)的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码(NativeCode)。
‘捌’ Python编译器是什么解释器是什么
python一般是解释执行的……就是说通常情况下是直接解释(或者说你不知道有编译这个过程)
python实际执行的时候会将代码编译成字节码的pyc文件(这一步是编译,由编译器负责)之后执行pyc当中的字节码(这一步是解释器的工作,为了避免每次运行都要编译加快速度)
‘玖’ Python 编译器与解释器
编译器是整体编译再执行,而解释器是边解释便执行。
举个简单的例子,编译器就相当于你买了一桶海底捞,那么所有海底捞食材都是整体“编译”好,只要通过倒水(执行)就可以吃,而解释器相当于你去海底捞门店,然后菜是一道一道上(一条一条解释这是啥菜),你是一道一道放入汤中吃(执行)。
编译器 的特点是:
解释器 的特点是:
python的源文件通过解释器进行模块的加载及链接,然后将解释完成的字节码存入内存,提供给CPU进行操作,然后写入本地的.pyc文件,其触发条件是判断 是否存在.pyc文件+比较源文件与编译的.pyc文件的时间戳
‘拾’ Pycharm配置python编译器
安装了python且通过pip安装selenium,打开Pycharm
输入 from selenium import webdriver报错,此时,需配置Pycharm(2019)使用的编译器为自己安装的python
方法:File->Settings->Project:xxx ->Project Interpreter
(1)选择Show All...
(2)点击 +,选择Existing environment,浏览选择已安装的python