跳转至

其他

都说Python执行效率不高,为什么还要学习它?

就像你买了一辆汽车,有人却说, 汽车开的比飞机慢多了,买什么汽车啊。 然而,生活中大部分的场合,用汽车比用飞机方便的多。

同样的道理通常你开发的程序(自动化工具、网站后端等),Python的执行效率完全足够了。

如果一定要比执行效率,谁都比不过 二进制机器代码, 为什么程序员 不直接写 二进制机器代码 呢?

很多时候, 更重要的是看 开发效率

Python最大的优势是 开发效率 高 。

同样的系统,用Python 开发通常比用其他语言 所需的时间 少的多。 (这是在 对语言的熟练度相同 的情况下 的对比)

通常Python 开发一个项目 10天, 其他语言或许要 15 - 30天。

开发的速度快,这有多么重要,大家都能明白。


最后我们再来看 执行效率

  • Python 执行效率真的低吗?

    要看写的代码做的什么事情。

    就拿代码常见的字符串处理来说,Python官方解释器底层就是C语言开发的,本身就经过了大量地优化。

    普通的 C程序员,水平有限,对字符串处理没有特别的优化,写出的程序 或许比 Python 效率更低。

    Python很多的库,比如字符串处理、加解密、科学计算、人工智能,底层都是C语言开发的,执行效率并不低。

    Python慢的地方在于 解释器对 语言逻辑代码的 解释执行速度 相对比较慢, 如果这些并不是你的程序中 最耗费时间的部分,Python语言就不会成为你程序的主要瓶颈。

  • 你的程序真的需要那么高的执行效率的吗?

    就拿开发网站服务来说 , 网站后端的性能瓶颈 通常在 数据库操作。

    假设我们开发一个web服务

    如果有一个请求的处理,假设java代码执行要0.01毫秒, python代码 要0.05毫秒, java比Python快5倍,对吧?

    但是处理这个请求还要访问数据库, 这个操作和使用什么编程语言无关,java和Python花费的时间确是一样的,都要50毫秒。

    这样 java的服务 50.01毫秒, 而Python是50.05毫秒,差别可以忽略不计了。

    所以很多场景,即使语言本身执行性能再高,总体性能也高不起来。

白月黑羽 根据 前程无忧网站 的搜索结果, python在 国内的职位需求 仅次于 java、js 、c/c++ 位列第四,超过php、c#等明星语言。 而且成长势头来看,速度超过前面3位。

运行Python程序,提示找不到Python命令

如果你运行python的时候,显示如下

c:\>python first.py
'python' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

这是因为,你安装Python解释器的时候,没有勾选 add Python to path

所以,命令行程序找不到Python.exe 在什么地方。

怎么解决这个问题呢?

如果你是Windows 操作系统,不需要重装Python, 在Windows环境变量path里面加上 Python解释器所在路径即可。

点击这里,打开windows设置

image


然后,如下下图所示,输入 huanj,点击 编辑系统环境变量

image


然后,在弹出对话框中,点击 环境变量

image


然后,双击系统变量栏目下面的 path 这条

image


然后,按照下图操作

image


注意:

  • 你要看看你的python解释器安装在什么目录,填写你的目录。

  • 一定是python所在目录 ,不要在最后加上python.exe

  • 把python目录中的scripts目录也加上,就是最后要多两条记录,如下所示

image


最后,很重要,

因为刚才对环境变量的修改,对已经打开的窗口不生效!!!

所以你必须 关闭 你已经打开的命令行窗口, 重新打开一个窗口 , 再次执行python程序。

好了,大功告成。


运行Python程序,提示找不到代码文件

如果你运行python的时候,显示如下

c:\>python first.py
python: can't open file 'first.py': [Errno 2] No such file or directory

这是什么原因?

要运行一个Python脚本,通常我们需要打开命令行窗口,并 进入到该脚本所在的目录 。 这样Python解释器才能找到这个程序。

比如我们要运行的Python脚本的全路径 是 'd:\tmp\price.py'

那么我们通常需要进入到 'd:\tmp' 目录下面,然后再执行 命令 python price.py

当然,你也可以 在命令行中使用 脚本的全路径 , 像这样 python d:\tmp\price.py 。 就可以在任意目录下面执行成功了。


查看和修改当前工作目录

当前Python程序的工作目录,可以通过 os.getcwd 获得,如下

import os
curDir = os.getcwd()

如果要修改当前工作目录,使用 os.chdir,如下

import os
os.chcwd('d:\\home')


查看导入的模块的路径

要知道导入的模块 对应的 代码文件的路径,可以使用模块的 __file__ 属性。

如下所示

>>> import selenium
>>> selenium.__file__
'C:\\Python36\\lib\\site-packages\\selenium\\__init__.py'
>>>


查看当前正在执行的代码文件的路径

有时候,我们需要得到 当前执行的代码文件 的 全路径。

这时候,我们可以 使用 os.path.realpath(__file__)

如下所示

import os

# 当前代码文件路径
current_script_path = os.path.realpath( __file__ )
print(current_script_path)

# 代码文件所在目录路径
print(os.path.dirname(current_script_path))


查看当前运行的python解释器的路径

有时候,我们需要得到 当前运行的python解释器的路径。

比如,我们需要使用当前的python解释器再运行 另外一个脚本程序

这时候,我们可以 使用 sys.executable 得到当前运行的python解释器的路径。

如下所示

import os,sys

pid_or_handle1 = os.spawnl(
    os.P_NOWAIT,
    sys.executable,
    sys.executable, 
    "otherscript.py", 
    'param1',
    'param2')


判断一个对象是否可以执行

hasattr函数可以用来判断变量对应的对象是否是可执行的。

返回值为True就是可执行的。

如下所示

def obj1():
    pass

obj2 = 'ok'

hasattr(obj1,'__call__') # 返回 True
hasattr(obj2,'__call__') # 返回 False


字符串IP地址转换为 整数IP地址

我们做性能测试时,有时需要让网卡绑定很多IP地址,这时候,需要 把字符串IP地址转换为 整数IP地址。

可以这样做

import socket,struct

strIP = "192.168.0.1"
intIP = socket.ntohl(struct.unpack("I",socket.inet_aton(strIP))[0])
print(intIP)

如果反过来,需要把 整数IP转换为字符串IP,可以这样

import socket,struct
intIP = 3232235521
strIP = socket.inet_ntoa(struct.pack('I',socket.htonl(intIP))) 
print(strIP)

提示ModuleNotFoundError

有的朋友明明已经安装了某个库,在Pycharm中编辑代码,导入库时,却有红色波浪线,提示

Unresolved reference '某个库名' 

运行也会报错,类似如下

c:\untitled\venv\Scripts\python.exe C:/untitled/venv/first.py
Traceback (most recent call last):
  File "C:/untitled/venv/first.py", line 1, in <module>
    from PySide2.QtWidgets import QApplication, QMessageBox
ModuleNotFoundError: No module named 'PySide2'

那是因为你们用Pycharm创建项目的时候,使用的解释器环境是新建的venv环境。

而你们执行pip安装的库,安装到了基础解释器环境(非venv)下面。

两种解决方法:

  • 第一种:修改Pycharm使用基础解释器环境

参考这里

  • 第二种:执行venv环境里面的pip,安装这个库