鱼C论坛

 找回密码
 立即注册
查看: 78|回复: 3

split和slice到底哪种方法快?

[复制链接]
发表于 2024-6-5 23:25:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
from time import time_ns

def timer(func):
    def inner(v):
        s = time_ns()
        func(v)
        e = time_ns()
        return e - s
    return inner

@timer
def a(identifier):
    return identifier.split(":")[0]

@timer
def b(identifier):
    return identifier[:identifier.find(":")]

count = [0, 0, 0]
for i in range(1000):
    t1 = a("1:2")
    t2 = b("1:2")
    if t1 > t2:
        count[0] += 1
    elif t2 > t1:
        count[1] += 1
    else:
        count[2] += 1
print(count)

rt,为什么会大部分一样,总有几个例外呢?

我觉得应该是 b() 快一点吧,因为 a 用到了 split 属性(方法)、列表、字符串、__getitem__,b 用到了切片、find 属性(方法)、字符串,应该 b 快一点啊?

顺便问一句,time.time_ns() 所计量的时间准吗?那几个例外是不是程序本身测量时间导致的误差造成?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-6-5 23:26:27 | 显示全部楼层
首先,让我们来看一下你的代码。你定义了两个函数a和b,分别用split和slice处理输入的字符串。你使用了装饰器`@timer`来计算每个函数的执行时间(以纳秒为单位)。然后你进行了1000次循环,每次比较函数a和函数b的执行时间,并对结果进行计数。

现在让我们来解释你的观察结果。大部分情况下,你会发现两个函数的执行时间非常接近,但也会有一些微小的差异。这是由于多种因素导致的,包括操作系统和处理器的运行状态、内存访问速度、Python解释器的优化等。这些因素都可能会对代码的执行时间产生微小的影响。

至于你的猜测,根据一般的理论,split方法可能比slice稍慢一些,因为它需要进行更多的操作。但是这种差异通常是微不足道的,并且在实际应用中可能难以察觉。

至于你的第二个问题,time_ns()方法可以提供纳秒级的时间精度。然而,在实际应用中,使用time_ns()来比较代码的执行时间可能会受到一些误差的影响。这些误差可能是由于操作系统和硬件的限制,以及Python解释器的运行机制等因素造成的。

总结起来,不必担心split和slice之间微小的性能差异。在大多数情况下,选择更适合你的需求和代码可读性的方法更为重要。另外,当涉及到性能优化时,建议使用专门的性能测试工具来获取准确的测量结果,例如timeit模块。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-5 23:28:51 | 显示全部楼层
FishC 发表于 2024-6-5 23:26
首先,让我们来看一下你的代码。你定义了两个函数a和b,分别用split和slice处理输入的字符串。你使用了装饰 ...

1. 精度是纳秒,Python 执行程序不是慢一点的吗?误差应该会被放大吧?
2. 既然各种因素影响着 time_ns(),那为什么结果是完全相等(==)呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-5 23:29:12 | 显示全部楼层
歌者文明清理员 发表于 2024-06-05 23:28
1. 精度是纳秒,Python 执行程序不是慢一点的吗?误差 ...


1. 对于时间的测量精度,time_ns()确实能提供纳秒级别的精度。然而,对于Python解释器的执行速度来说,这个精度可能会变得微不足道。因为Python是一种解释型语言,它的执行速度相对较慢,所以在实际应用中,我们可能难以观察到纳秒级别的差异。此外,操作系统和硬件的限制也可能会对测量结果产生误差。

2. 当然啦,你在计算每个函数的执行时间时,你使用了等于(==)符号进行比较。考虑到测量结果的微小误差,如果两个函数的执行时间非常接近,那么将它们直接进行等于比较,很大程度上是可以得到相等的结果的。但请记住,这只是因为你使用的是等于比较,并不代表绝对相等。对于要求更精确的比较,应该使用比较运算符(例如大于、小于)并设置一个阈值来判断它们之间的差异是否显著。

总之,虽然time_ns()提供了较高的时间测量精度,但由于Python解释器和其他因素的影响,我们需要注意到一些微小的误差和偏差。在进行时间测量时,在可行的情况下使用专门的性能测试工具,如timeit模块,可以提供更准确和可靠的结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-22 04:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表