Передача объекта в цикле - python
Я передаю большой объект в for
Цикл для функции и в этой функции доступ к атрибутам объекта в другом цикле, так как это казалось лучшим способом. Однако затем я получил замедление почти в 1000 раз, и поэтому я изменил передачу объекта на передачу необходимых атрибутов, и теперь он работает нормально.
Переданный объект является двоичным объектом, импортированным clr
а не объект питона.
Но когда я сделал отдельный тест, как показано ниже, я получил совершенно противоположные результаты.
Вот мой тест:
class test_Obj():
def __init__(self):
self.x = 34
self.y = 34
self.z = 34
class test_Obj2():
def __init__(self):
self.x2 = test_Obj()
self.y2 = test_Obj()
self.z2 = test_Obj()
def test1(test_Obj2):
res = list()
for i in range(100000):
res.append(test_Obj2.z2.z)
return res
def test2(z):
res = list()
for i in range(100000):
res.append(z)
return res
def test3():
res = list()
start_time = time()
for i in range(1000):
res.append(test1(test_Obj2()))
end_time = time()
print end_time - start_time
start_time = time()
for i in range(1000):
res.append(test2(test_Obj2().z2.z))
end_time = time()
print end_time - start_time
и вывод, который я получил, как показано ниже
>>> import temp as t
>>> t.test3()
94.2169342041
423.085632324
Может кто-нибудь, пожалуйста, помогите мне понять это поведение?
1 ответ
Ваш первый тест создает список из 1000 элементов, каждый из которых представляет собой список из 100 000 целых чисел. Это 100 000 000 элементов списка.
Второй тест создает еще 1000 списков из 100 000 целых чисел, которые он хранит в конце первых 1000 списков.
Это может быть медленнее, потому что у вас закончилась реальная память и вы начали выполнять разбиение по страницам на диск, или потому что началась сборка мусора и пришлось проверить предыдущие 100 000 000 элементов, чтобы пометить их как все еще доступные, или, возможно, просто потому, что в вашей системе выполнялось что-то еще в это время.
использование timeit
как предложил Martijn, и обязательно очистите после первого теста (или лучше запустите два отдельных сценария). Я предполагаю, что когда все остальное будет равным, передача в объекте будет немного медленнее (потому что у вас есть 200000 000 поисков атрибутов, а не 2000 в test2).