• 加快Python运行速度


    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连接。第三要确保在不需要时不创建新的对象实例。通过大量的编程练习,掌握一些高级的编程方法对你十分重要。

    ------ 往事如烟,伴着远去的步伐而愈加朦胧。未来似雾,和着前进的风儿而逐渐清晰!
  • 相关阅读:
    安装Elasticsearch,Logstash,Kibana(5.0.1-mac版)
    代理服务器
    浅谈微信三级分销系统的漏洞
    Highcharts图表.net版开源,支持webform 和 mvc3,完全开源
    (转)搞个这样的APP要多久?心酸啊。
    (转)nginx+iis实现负载均衡
    (转).NET技术大系概览 (迄今为止最全的.NET技术栈)
    (转)Asp.Net Mvc视图引擎Razor介绍
    (转)多种方法实现Loading(加载)动画效果
    (转)C# 正则表达式
  • 原文地址:https://www.cnblogs.com/cutesnow/p/14512970.html
Copyright © 2020-2023  润新知