我制作了一些脚本,可以生成银河系中行星的“planetsCount”,并检查“testsCount”次。 (邮件末尾的代码)
一些结果:
Preparing was done in 0.0 seconds, planetsCount is 10, testsCount is 1000000
First test time is 2.50099992752 sec
Second test time is 2.5 sec
Preparing was done in 0.0160000324249 seconds, planetsCount is 1000, testsCount is 1000000
First test time is 6.97200012207 sec
Second test time is 2.54799985886 sec
Preparing was done in 0.406000137329 seconds, planetsCount is 100000, testsCount is 10000
First test time is 6.09399986267 sec
Second test time is 0.0310001373291 sec
通过属性检查有稳定的时间。
在小列表上通过“列表中的项目”检查更快,但在大列表上非常慢。
代码如下
import random
import base64
import time
class Planet(object):
def __init__(self, state, name):
self.is_discovered = state
self.name = base64.b64encode(name)
class Galaxy(object):
planets = {}
explored = []
def __init__(self, planetCount):
for planetIndex in xrange(planetCount):
planetName = base64.b64encode(str(planetIndex))
is_discovered = random.choice([True, False])
planet = Planet(is_discovered, planetName)
self.planets.update({planetName: planet})
if is_discovered:
self.explored.append(planetName)
startTime = time.time()
planetsCount = 10
testsCount = 1000000
galaxy = Galaxy(planetsCount)
print "Preparing was done in {} seconds, planetsCount is {}, testsCount is {}".format(time.time() - startTime, planetsCount, testsCount)
startTime = time.time()
for x in xrange(testsCount):
planetName = base64.b64encode(str(random.randint(0, planetsCount - 1)))
planetName in galaxy.explored
print "First test time is {} sec".format(time.time() - startTime)
startTime = time.time()
for x in xrange(testsCount):
planetName = base64.b64encode(str(random.randint(0, planetsCount - 1)))
galaxy.planets[planetName].is_discovered
print "Second test time is {} sec".format(time.time() - startTime)