У вас есть проблема XY .
Вы пытаетесь сократить время, необходимое для устранения вашей первоначальной проблемы. Вместо этого вы должны просто установить правильный формат чисел.
Range("v11:ay9000").numberformat = "0%;-0%;;"
Это зависит от того, что вы собираетесь с ним делать.
Наборы значительно быстрее определяют, присутствует ли объект в наборе (как в x в s
), но медленнее, чем списки, когда дело доходит до перебора их содержимого.
Вы можете использовать модуль timeit , чтобы узнать, какой из них быстрее в вашей ситуации.
from datetime import datetime
listA = range(10000000)
setA = set(listA)
tupA = tuple(listA)
#Source Code
def calc(data, type):
start = datetime.now()
if data in type:
print ""
end = datetime.now()
print end-start
calc(9999, listA)
calc(9999, tupA)
calc(9999, setA)
Вывод после сравнения 10 повторений для всех 3: Сравнение
Я интересовался результатами при проверке с CPython, если значение является одним из небольшого количества литералов. set
победы в Python 3 по сравнению с tuple
, list
и or
:
from timeit import timeit
def in_test1():
for i in range(1000):
if i in (314, 628):
pass
def in_test2():
for i in range(1000):
if i in [314, 628]:
pass
def in_test3():
for i in range(1000):
if i in {314, 628}:
pass
def in_test4():
for i in range(1000):
if i == 314 or i == 628:
pass
print("tuple")
print(timeit("in_test1()", setup="from __main__ import in_test1", number=100000))
print("list")
print(timeit("in_test2()", setup="from __main__ import in_test2", number=100000))
print("set")
print(timeit("in_test3()", setup="from __main__ import in_test3", number=100000))
print("or")
print(timeit("in_test4()", setup="from __main__ import in_test4", number=100000))
Вывод:
tuple
4.735646052286029
list
4.7308746771886945
set
3.5755991376936436
or
4.687681658193469
Для 3 - 5 литералов, set
все еще победы с большим отрывом, и or
становится самым медленным.
В Python 2, set
является всегда самым медленным. or
является самым быстрым для 2 - 3 литералов, и tuple
, и list
быстрее с 4 или больше литералами. Я не мог отличить скорость [1 112] по сравнению с [1 113].
то, Когда значения для тестирования кэшировались в глобальной переменной из функции, вместо того, чтобы создать литерал в цикле, set
, победило каждый раз, даже в Python 2.
, Эти результаты относятся к 64-разрядному CPython на Core i7.