Python中数值比较的效率

目录
  • Python数值比较的效率
  • 不同python实现的效率比较
    • 1.取出内层容器的多个值
    • 2.字符串去掉结尾(开头)字符
    • 3. in 操作要用集合
  • 总结

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

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

总结

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

(0)

相关推荐

  • Python实现的字典值比较功能示例

    本文实例讲述了Python实现的字典值比较功能.分享给大家供大家参考,具体如下: #coding=utf8 import logging import os from Lib.DealCsv import ExceptPropertyDic from wxPython._wx import false ''''' 用于json数据的比较,包含属性.属性值的比较. ''' #用于比较字符串.列表 PATH=lambda p:os.path.abspath(os.path.join( os.path

  • python集合常见运算案例解析

    本文实例讲述了python集合常见运算.分享给大家供大家参考,具体如下: python生成不重复随机数放在列表中的效率比较 import random import time def RandomNumbers(number, start, end): '''使用列表来生成number个介于start和end之间的不重复随机数''' data = [] n = 0 while True: element = random.randint(start, end) if element not in

  • Python数据分析之pandas比较操作

    一.比较运算符和比较方法 比较运算符用于判断是否相等和比较大小,Python中的比较运算符有==.!=.<.>.<=.>=六个,Pandas中也一样. 在Pandas中,DataFrame和Series还支持6个比较方法,详见下表. 方法 英文全称 用途 eq equal to 等于 ne not equal to 不等于 lt less than 小于 gt greater than 大于 le less than or equal to 小于等于 ge greater than

  • Python中数值比较的效率

    目录 Python数值比较的效率 不同python实现的效率比较 1.取出内层容器的多个值 2.字符串去掉结尾(开头)字符 3. in 操作要用集合 总结 Python数值比较的效率 Python 数值比较运算效率:>,<,==,!=,>=和<= python数值比较运算有6种,分别为>,<,==,!=,>=和 <=.他们的运算效率如何?采用哪种方式最高效?本文通过使用timeit来测试比较运算的效率. 程序如下: import timeit def fun

  • 如何提高python 中for循环的效率

    对于某个城市的出租车数据,一天就有33210000条记录,如何将每辆车的数据单独拎出来放到一个专属的文件中呢? 思路很简单: 就是循环33210000条记录,将每辆车的数据搬运到它该去的文件中. 但是对于3000多万条数据,一个一个循环太消耗时间,我花了2个小时才搬运了60万数据,算算3000万我需要花费100个小时,也就需要4-5天.并且还需要保证这五天全天开机,不能出现卡机的事故. 因此,需要使用并行进行for循环的技巧: 由于3000万数据放到csv中导致csv打不开,因此我就把一个csv

  • 源码解析python中randint函数的效率缺陷

    目录 一.前言 二.对randint()运行效率的测试 三.从源码分析randint()的缺陷 random.random() random.randint() 四.更快的生成随机整数的方法 random.random() 直接使用 getrandbits() 使用 Numpy.random 一.前言 前几天,在写一个与差分隐私相关的简单程序时,我发现了一些奇怪的东西:相对于其他的随机数生成函数,Python的random.randint()函数感觉很慢. 由于 randint() 是 Pyth

  • Python中的四种交换数值的方法解析

    这篇文章主要介绍了Python中的四种交换数值的方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 交换两个变量的值方法,这个面试题如果只写一种当然很简单,没什么可以说的. 今天这个面试是问大家有几种办法来实现交换两个变量的值. 在没开始看具体答案前,你可以先想想看 下面分别来说说这几种方法 方法一 通过新添加中间变量temp的方式,这个方法是最简单的,每个语言都适用. 方法二 Python独有的方法,一行代码就能搞定,直接将两个变量放到元

  • Python中map和列表推导效率比较实例分析

    本文实例讲述了Python中map和列表推导效率比较.分享给大家供大家参考.具体分析如下: 直接来测试代码吧: #!/usr/bin/env python # -*- coding: utf-8 -*- # list comprehension and map import time def test(f, name): st = time.time() f() print '%s %ss'%(name, time.time()-st) TIMES = 1000 ARR = range(1000

  • python中in在list和dict中查找效率的对比分析

    首先给一个简单的例子,测测list和dict查找的时间: import time query_lst = [-60000,-6000,-600,-60,-6,0,6,60,600,6000,60000] lst = [] dic = {} for i in range(100000000): lst.append(i) dic[i] = 1 start = time.time() for v in query_lst: if v in lst: continue end1 = time.time

  • python中利用numpy.array()实现俩个数值列表的对应相加方法

    小编想把用python将列表[1,1,1,1,1,1,1,1,1,1] 和 列表 [2,2,2,2,2,2,2,2,2,2]对应相加成[3,3,3,3,3,3,3,3,3,3]. 代码如下: import numpy a = numpy.array([1,1,1,1,1,1,1,1,1,1]) b = numpy.array([2,2,2,2,2,2,2,2,2,2]) c = a + b print(type(c)) print(list(c)) 输出结果为: <class 'numpy.nd

  • 关于Python中的向量相加和numpy中的向量相加效率对比

    直接使用Python来实现向量的相加 # -*-coding:utf-8-*- #向量相加 def pythonsum(n): a = range(n) b = range(n) c = [] for i in range(len(a)): a[i] = i**2 b[i] = i**3 c.append(a[i]+b[i]) return a,b,c print pythonsum(4),type(pythonsum(4)) for arg in pythonsum(4): print arg

  • Python查找数组中数值和下标相等的元素示例【二分查找】

    本文实例讲述了Python查找数组中数值和下标相等的元素.分享给大家供大家参考,具体如下: 题目描述: 假设一个单调递增的数组中的每个元素都是整数并且是唯一的.请编程实现一个函数,找出数组中任意一个数值等于其下标的元素,例如在数组[-3,-1,1,3,5]中,3和他的下标相等. 采用二分查找:如果数组中的数字小于下标,由于下标是-1的递减数列,但是数组中的元素差值大于等于-1,因此左边的不可能等于下标.如果数组中的数字大于下标,同理,之后的数字肯定都大于下标,往左边查找. 算法示例: # -*-

  • python 中的9个实用技巧,助你提高开发效率

    整理字符串输入 整理用户输入的问题在编程过程中极为常见.通常情况下,将字符转换为小写或大写就够了,有时你可以使用正则表达式模块「Regex」完成这项工作.但是如果问题很复杂,可能有更好的方法来解决: user_input = "This string has some whitespaces... " character_map = { ord( ) : , ord( ) : , ord( ) : None } user_input.translate(character_map) #

随机推荐