Python限制列表出现的最快方法

Python限制列表出现的最快方法,python,time-complexity,Python,Time Complexity,我想知道为什么O(n)中的list.count()几乎和我的自定义方法一样快,有两个if和两个赋值 基本方法应为O(n*m),其中n是输入元素的长度,m是输出元素的长度。 我的方法应该在O(n)中,其中n是输入元素的长度 任何想法都将不胜感激 from timeit导入默认计时器作为计时器 从输入导入列表开始 def运行测试时间(函数、n\u重复、*args): 开始=计时器() res=[func(*args)表示范围内的u(n_重复)] 结束=计时器() 返回结束-开始,res 定义方法自定

我想知道为什么O(n)中的
list.count()
几乎和我的自定义方法一样快,有两个if和两个赋值

基本方法应为
O(n*m)
,其中
n
是输入元素的长度,
m
是输出元素的长度。 我的方法应该在
O(n)
中,其中
n
是输入元素的长度

任何想法都将不胜感激

from timeit导入默认计时器作为计时器
从输入导入列表开始
def运行测试时间(函数、n\u重复、*args):
开始=计时器()
res=[func(*args)表示范围内的u(n_重复)]
结束=计时器()
返回结束-开始,res
定义方法自定义(元素:List[int],exclude\u len:int=2):
元素\u out=list()
#0(len(元素)*~1)
上一个值,上一个值计数器=无,0
对于元素中的元素:
如果元素==上一个值,则上一个值计数器=上一个值计数器+1,否则为0
如果上一个值计数器<排除值:
元素\u out.append(元素)
prev_val=元素
返回元素
定义方法计数(元素:列表[int],排除元素:int=2):
元素_out=[]
#O(长(元素)*长(元素)
对于元素中的值:
如果元素计数(值)<排除长度:
元素\u out.append(值)
返回元素
如果名称=“\uuuuu main\uuuuuuuu”:
N_测试=1_000_000
输入元素=排序([1,2,3,3,3,3,3,4,5,8])
打印(f'n_测试:{n_测试}')
打印('方法\计数计时器:',结束='')
计时器\u 1,res\u 1=运行\u测试\u计时(方法\u计数、N\u测试、输入\u元素)
打印(计时器1、分辨率1[0])
打印('方法\自定义计时器:',结束='')
定时器2,res 2=运行测试计时(方法自定义,N测试,输入元素)
打印(计时器2、分辨率2[0])
输出:

n_tests : 1000000
method_count timer : 1.665171445987653 [1, 2, 3, 3, 4, 5, 8, 8]
method_custom timer : 1.5837802449823357 [1, 2, 3, 3, 4, 5, 8, 8]

增加元素的数量使其比预期的有巨大的收益更为明显

这是完整的代码

随机导入
从输入导入列表开始
从timeit导入默认\u计时器作为计时器
def运行测试时间(函数、n\u重复、*args):
开始=计时器()
res=[func(*args)表示范围内的u(n_重复)]
结束=计时器()
返回结束-开始,res
定义方法自定义(元素:List[int],exclude\u len:int=2):
元素\u out=list()
#0(len(元素)*~1)
上一个值,上一个值计数器=无,0
对于元素中的元素:
如果元素==上一个值,则上一个值计数器=上一个值计数器+1,否则为0
如果上一个值计数器<排除值:
元素\u out.append(元素)
prev_val=元素
返回元素
定义方法计数(元素:列表[int],排除元素:int=2):
元素_out=[]
#O(长(元素)*长(元素)
对于元素中的值:
如果元素计数(值)<排除长度:
元素\u out.append(值)
返回元素
如果名称=“\uuuuu main\uuuuuuuu”:
N_测试=1_000
N_元素=1_000
打印(f'N_测试:{N_测试}')
打印(f'N_元素:{N_元素}')
输入元素=已排序([random.randint(0,100)表示范围内的元素(N个元素)])
打印('方法\计数计时器:',结束='')
计时器\u 1,res\u 1=运行\u测试\u计时(方法\u计数、N\u测试、输入\u元素)
打印(计时器1),分辨率1[0])
打印('方法\自定义计时器:',结束='')
定时器2,res 2=运行测试计时(方法自定义,N测试,输入元素)
打印(计时器2),分辨率2[0])

您是否尝试过用不同的长度检查您的
O
假设?请注意,
O
是渐进复杂性,而不是绝对计时