代码见最后。
在学习排序算法时,本想写个pytest比较一下时间,结果发现结果老是failed。仔细想了下之前看过类似文章提到过赋值时特别注意,于是检查了代码,发现是生成数组的函数有问题,因为我使用的scope=module
,于是create_list这个函数返回的值在整个test_sorts.py
的测试中是同一个,如果冒泡简单的赋值给另外一个列表,那么我引用的时候实际上还是会影响原始的列表,原始的列表实际和赋值的列表在内存中是同一个。
最简单的解决办法是把scope=module
换为function范围,这样每个test_函数都会重新调用create_list生成列表,但是强迫症的我想用同一个数组测。
于是查看了关于python拷贝,通过copy浅拷贝可以实现修改的列表和原始列表不同,这样便可以区别开。
但是,如果你的浅拷贝的列表里面设计了其他的可变对象,在修改这个对象的时候两个列表是指向的同一个,修改会反映到两个列表中,深拷贝没有这个问题。
详细参考这篇博客。
测试执行:
pytest -v -s test_sorts.py # 详细/标准打印模式
#!/usr/bin/python
# coding: utf-8
from algorithm.sort.basicSort import *
import pytest
from random import randint
import time
from functools import wraps
def run_timer(f):
@wraps(f)
def function_timer(*args, **kwargs):
ts = time.time()
result = f(*args, **kwargs)
te = time.time()
print("\nTotal time running {0}: {1} seconds".format(f.__name__, str(te - ts)))
return result
return function_timer
@pytest.fixture(scope="module", params=[100, 1000, 10000])
def create_list(request):
nums = []
for i in range(request.param):
nums.append(randint(0, request.param))
return nums
@run_timer
def test_bubble_sort(create_list):
origin_list = create_list.copy()
sort_list = bubble_sort(origin_list)
# print(sort_list, create_list, origin_list)
assert sort_list != create_list
@run_timer
def test_insert_sort(create_list):
origin_list = create_list.copy()
sort_list = insert_sort(origin_list)
# print(sort_list, create_list)
assert sort_list != create_list