Python中数值比较的效率

 更新时间:2023年01月28日 15:33:21   作者:风华明远  
这篇文章主要介绍了Python中数值比较的效率,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Python数值比较的效率

Python 数值比较运算效率:>,<,==,!=,>=和<=

python数值比较运算有6种,分别为>,<,==,!=,>=和 <=。他们的运算效率如何?采用哪种方式最高效?本文通过使用timeit来测试比较运算的效率。

程序如下:

import timeit                                                       
                                                                    
def func1():                                                        
    for i in range(100000):                                         
        if i > 0:                                                   
            k = 2                                                   
                                                                    
def func2():                                                        
    for i in range(100000):                                         
        if i < 0:                                                   
            k = 2                                                   
                                                                    
def func3():                                                        
    for i in range(100000):                                         
        if i == 0:                                                  
            k = 2                                                   
                                                                    
def func4():                                                        
    for i in range(100000):                                         
        if i != 0:                                                  
            k = 2                                                   
                                                                    
def func5():                                                        
    for i in range(100000):                                         
        if i >= 0:                                                  
            k = 2                                                   
                                                                    
def func6():                                                        
    for i in range(100000):                                         
        if i <= 0:                                                  
            k = 2                                                   
                                                                    
                                                                    
                                                                    
if __name__ == '__main__':                                          
    func1()                                                         
    func=[func1,func2,func3,func4,func5,func6]                      
    op = [">","<","==","!=",">=","<="]                              
    for j in range(6):                                              
        v = 0                                                       
        timer = timeit.Timer(func[j])                               
        v+= timer.timeit(number=1000)                               
        print(op[j],":",v)                                          

这是只有if语句的情况,结果如下:

比较运算所用时间
>3.2038074
<2.7034741
==2.6940471000000006
!=3.285996800000001
>=3.205210300000001
<=2.6961838999999994

加上else语句则:

比较运算所用时间
>3.2270024
<3.2400326
==3.2511219999999996
!=3.1877201999999993
>=3.2120345000000015
<=3.2339978999999985

一般情况下,第一个分支比较节省时间。第二个分支会耗时稍微多一些。

不同python实现的效率比较

1.取出内层容器的多个值

如果要从嵌套的列表中获取内层列表每个索引对应的最大(或最小值),有两种方法:

import time
import random
a = [[random.randint(0, 1000) for i in range(10)] for j in range(100000)]

def method_x(a):
    """每个索引位置一个生成器表达式"""
    begin = time.time()
    b = min(i[0] for i in a)
    c = min(i[1] for i in a)
    d = min(i[2] for i in a)
    e = min(i[3] for i in a)
    f = min(i[4] for i in a)
    g = min(i[5] for i in a)
    h = min(i[6] for i in a)
    i = min(i[7] for i in a)
    j = min(i[8] for i in a)
    k = min(i[9] for i in a)
    print(time.time()-begin)

def method_y(a):
    """只循环一次算出各个索引对应的值"""
    begin = time.time()
    b,c,d,e,f,g,h,i,j,k = 100,100,100,100,100,100,100,100,100,100
    for t in a:
        b = min(t[0], b)
        c = min(t[1], c)
        d = min(t[2], d)
        e = min(t[3], e)
        f = min(t[4], f)
        g = min(t[5], g)
        h = min(t[6], h)
        i = min(t[7], i)
        j = min(t[8], j)
        k = min(t[9], k)
    print(time.time()-begin)

结果

>>> method_x(a*10)
1.1728243827819824
>>> method_y(a*10)
2.1234960556030273

2.字符串去掉结尾(开头)字符

去除字符串结尾字符,批量操作的话,一般使用 rstrip() 函数,但是这个函数效率不如直接索引快。

import random
import time
# a为10万个长度是11位的字符串列表;b为10万长度为9位的字符串列表;
a = [f'{random.randint(10,100)}xxxyyyzzz' for i in range(100000)]
b = [f'{random.randint(100000,110000)}xyz' for i in range(100000)]
def test1(a, str_cut):    # replace
    b = time.time()
    c = [i.replace(str_cut, '') for i in a]
    print(time.time()-b)

def test2(a, str_cut):    # rstrip()
    b = time.time()
    c = [i.rstrip(str_cut) for i in a]
    print(time.time()-b)

def test3(a, str_cut):    # 索引
    b = time.time()
    x =len(str_cut)
    c = [i[:-x] for i in a]
    print(time.time()-b)

结果比较,当想去掉字符长度大于保留的长度的时候,rstrip() 效率趋近于 replace() , 想去掉的字符长度小于保留部分时,rstrip() 趋近于直接索引。

>>> test1(a*10, 'xxxyyyzzz')
0.2882061004638672
>>> test2(a*10, 'xxxyyyzzz')
0.2662053108215332
>>> test3(a*10, 'xxxyyyzzz')
0.16613411903381348

>>> test1(b*10, 'xyz')
0.2721879482269287
>>> test2(b*10, 'xyz')
0.1911303997039795
>>> test3(b*10, 'xyz')
0.1501011848449707

3. in 操作要用集合

按一样的逻辑写了两版程序,运行时间确差了好多,一步一步找,发现是 in 判断后面用的容器类型不一样。

a = range(0, 100000)
b = list(a)
c = set(a)

def test(a):
    t = time.time()
    c = 0
    for i in range(0, 100000, 13):
        if i in a:
            c += 1
    print(c)
    print(time.time()-t)

测试时间,差距极大:

>>> test(b)
7693
5.649996280670166
>>> test(a)
7693
0.0019681453704833984

每次判断之前把列表转换为集合,能改进运行的效率:

def test(a):
    t = time.time()
    c = 0
    a = set(a)
    for i in range(0, 100000, 13):
        if i in a:
            c += 1
    print(c)
    print(time.time()-t)

>>> test(b)
7693
0.005988359451293945

4. 内置的max()效率低

def getmax(a, b):
    if a >= b:
        return a
    return b

定义一个求最大值的函数,再用random模块提前创造一个长度100的data_list用于测试(random本身耗时高,会让比较效果不明显)。

def main():
    t = time.time()
    for a, b in data_list*10000:
        max(a, b)
    print(time.time()-t)


def main2():
    t = time.time()
    for a, b in data_list*10000:
        getmax(a, b)
    print(time.time()-t)

自定义的函数比使用内置的max()快了近一倍。

>>> main1()
0.2231442928314209
>>> main2()
0.14011740684509277

计算三个数中的最大值时也是这样。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python3用PIL把图片转换为RGB图片的实例

    python3用PIL把图片转换为RGB图片的实例

    今天小编就为大家分享一篇python3用PIL把图片转换为RGB图片的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • python爬虫中PhantomJS加载页面的实例方法

    python爬虫中PhantomJS加载页面的实例方法

    在本篇文章里小编给大家整理了关于python爬虫中PhantomJS加载页面的实例方法,有需要的朋友们可以参考下。
    2020-11-11
  • 用Python调用win命令行提高工作效率的实例

    用Python调用win命令行提高工作效率的实例

    今天小编就为大家分享一篇用Python调用win命令行提高工作效率的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python word转pdf代码实例

    python word转pdf代码实例

    这篇文章主要介绍了python word转pdf代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • 六个Python编程最受用的内置函数使用详解

    六个Python编程最受用的内置函数使用详解

    在日常的python编程中使用这几个函数来简化我们的编程工作,经常使用能使编程效率大大地提高。本文为大家总结了六个Python编程最受用的内置函数,感兴趣的可以了解一下
    2022-07-07
  • Python跨文件调用函数以及在一个文件中执行另一个文件

    Python跨文件调用函数以及在一个文件中执行另一个文件

    这篇文章主要给大家介绍了关于Python跨文件调用函数以及在一个文件中执行另一个文件的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友可以参考下
    2022-12-12
  • Pycharm导入anaconda环境的教程图解

    Pycharm导入anaconda环境的教程图解

    这篇文章主要介绍了Pycharm导入anaconda环境的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 6个Python办公黑科技,助你提升工作效率

    6个Python办公黑科技,助你提升工作效率

    这篇文章主要介绍了Python办公黑科技,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-08-08
  • 判断网页编码的方法python版

    判断网页编码的方法python版

    这篇文章主要为大家详细介绍了python代码判断网页编码的方法,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • pytorch cuda安装报错的解决方法

    pytorch cuda安装报错的解决方法

    这篇文章主要给大家介绍了关于pytorch cuda安装报错的解决方法,文中通过图文介绍的非常详细,对大家学习或者使用Pytorch具有一定的参考学习价值,需要的朋友可以参考下
    2023-01-01

最新评论