python运行速度-几个方法帮你加快Python运行速度

Python运行的慢是历来被诟病的,一方面和语言有关,另一方面可能就是你代码的问题。语言方面的问题我们解决不了,所以只能在编程技巧上来提高程序的运行效率。下面就给大家分享几个提高运行效率的编程方法。

首先,我们需要来衡量代码的时间和空间的复杂性,不然仅仅用我们的肉眼很难感受代码时间长短的变化。python中的profiler可以帮助我们测量程序的时间和空间复杂度。 使用时通过-o参数传入可选输出文件以保留性能日志。具体使用方法如下:

python -m cProfile [-o output_file] my_python_file.py

01 使用哈希表的数据结构

如果在程序中遇到大量搜索操作时,并且数据中没有重复项,则可以使用查找而不是循环。举例如下:

items = ["a", "b",..,"100m"] #1000s of items

found = False

for i in items:

if (i == "100m"):

found = True

可以改写为

items = {"a":"a", "b":"b:,..,"100m":"100m"} #each item is key/value

found = False

if "100m" in items:

found = True

02 矢量化取代循环

尽量使用基于C构建的Python库,例如Numpy,Scipy和Pandas,并且利用矢量化同时处理来取代程序中编写多次处理数组单个元素的循环,循环可能是程序优化最容易被拿来开刀的地方了。举例如下:在对数组中每个元素求平方时直接用数组相乘,而不是两个for循环。

import numpy as np

array = np.array([[1., 2., 3.], [4., 5., 6.]])

m_array = array*array

03 精简代码行数

在编程时,尽量使用一些python的内置函数来精简代码行数,是代码显得简洁凝练,大大提高代码运行效率。举例如下:

newlist = []

def my_fun(a):

return a + "t"

for w in some_list:

newlist.append(my_fun(w))

可以改写为

def my_fun(a):

return a + "t"

newlist = map(my_fun, some_list)

04 使用多进程

一般计算机都是多进程的,那么在执行操作时可以使用Python中的multiproccessing。多进程可在代码中实现并行化。 当您要实例化新进程,访问共享内存时,多进程成本很高,因此如果有大量数据处理时可以考虑使用多进程。 对于少量数据,则不提倡使用多进程。举例如下:

def some_func(d):

#computations

data = [1,2,..,10000] #large data

for d in data:

some_func(d)

可以改写为

import multiprocessing

def some_func(d):

#computations

data = [1,2,..,10000] #large data

pool = multiprocessing.Pool(processes=number_of_processors)

r = pool.map(some_func, data)

pool.close()

05 使用Cpython

Cython是一个静态编译器,可以为您优化代码。加载cypthonmagic扩展并使用cython标记使用cython编译代码。

Cpython的安装:

pip install Cython

Cpython的使用:

% load_ext cythonmagic

%%cython

def do_work():

... #computationally intensive work

06 尽量使用csv替代xlsx

在进行数据处理时, 我需要更长的时间才能将数据加载到excel文件或从excel文件保存数据。 相反,我选择了创建多个csv文件的路径,并创建了一个文件夹来对文件进行分组。举例如下:

df = pd.DataFrame([["a", "b"], ["c", "d"]],index=["row 1", "row 2"],columns=["col 1", "col 2"])

df.to_excel("my.xlsx")

df2 = df.copy()

with pd.ExcelWriter("my.xlsx") as writer:

df.to_excel(writer, sheet_name="Sheet_name_1")

df2.to_excel(writer, sheet_name="Sheet_name_2")

可以改写为

df = pd.DataFrame([["a", "b"], ["c", "d"]],index=["row 1", "row 2"],columns=["col 1", "col 2"])

df2 = df.copy()

df.to_csv("my.csv")

df2.to_csv("my.csv")

07 使用Numba

它是一个JIT(即时)编译器。 通过装饰器,Numba将带注释的Python和NumPy代码编译为LLVM 。将您的功能分为两部分:

1.执行计算的函数 - 使用@autojit进行装饰

2.执行IO的功能

from numba import jit, autojit

@autojit

def calculation(a):

....

def main():

calc_result = calculation(some_object)

d = np.array(calc_result)

#save to file

return d

08 使用Dask来并行化Pandas DataFrame

Dask很棒! 它帮助我处理数据框中的数值函数和并行的numpy。 我甚至试图在集群上扩展它,它就是这么简单!

import pandas as pd

import dask.dataframe as dd

from dask.multiprocessing import get

data = pd.DataFrame(...) #large data set

def my_time_consuming_function(d):

.... #long running function

ddata = dd.from_pandas(data, npartitions=30)

def apply_my_func(df):

return df.apply(

(lambda row: my_time_consuming_function(*row)), axis=1)

def dask_apply():

return ddata.map_partitions(apply_my_func).compute(get=get)

09 使用Pandarallel库

Pandarallel可以将pandas操作与多个进程并行化同样,仅在您拥有大型数据集时使用。

from pandarallel import pandarallel

from math import sin

pandarallel.initialize()

# ALLOWED

def my_time_consuming_function(x):

....

df.parallel_apply(my_time_consuming_function, axis=1)

总结

对于提高Python的性能,第一是先编写简洁,高效的代码。 我们必须确保代码不会在循环中反复执行相同的计算。第二不要为集合中的每个记录打开/关闭IO连接。第三要确保在不需要时不创建新的对象实例。通过大量的编程练习,掌握一些高级的编程方法对你十分重要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值