为 dict 生成优化嵌套 for 循环 Python 3
Optimize nested for loop for dict generation Python 3
我正在开发一款拥有无限世界的游戏。我有这个功能可以在我需要的时候生成它的块,我只需要将块坐标传递给它,它就会创建一个块并将其存储在字典中。
这是函数:
def generate(self, chunkx, chunky):
# print("Generating chunk at", chunkx, chunky)
Z_INDEX = [0,1,2,3]
floor_void_diff = 60
mountain = floor_void_diff + 7
high_mountain = mountain + 6
factor = 1/200
biome_factor = 1/300
floor = {}
items = {}
chunk = (chunkx, chunky)
if chunk not in self.chunks:
# print("Generating chunk at {}".format(chunk))
for y in range(chunky * core["world_gen"]["chunksize"], chunky * core["world_gen"]["chunksize"] + core["world_gen"]["chunksize"]):
for x in range(chunkx * core["world_gen"]["chunksize"], chunkx * core["world_gen"]["chunksize"] + core["world_gen"]["chunksize"]):
temperature = create_noise(8, x, y, 0.5, biome_factor, 0, 100, self.n1)
humidity = create_noise(8, x, y, 0.5, biome_factor, 0, 100, self.n2)
altitude = create_noise(8, x, y, 0.5, biome_factor, 0, 100, self.n3)
climate = (temperature, altitude, humidity)
# gen_biome(climate)
i = create_noise(16, x, y, 0.5, factor, 0, 100, self.noise)
if i >= floor_void_diff:
if i >= mountain:
if i >= high_mountain:
floor.update({(x, y): {"block" : Z_INDEX[3], "climate": climate}})
else:
floor.update({(x, y): {"block" : Z_INDEX[2], "climate": climate}})
else:
floor.update({(x, y): {"block" : Z_INDEX[1], "climate": climate}})
spawner = random.randint(-1, core["world_gen"]["item_spawn"])
random_item = random.randint(0, len(core["item_list"])-1)
if spawner == 0:
items.update({(x, y): core["item_list"][random_item]})
elif i < floor_void_diff:
floor.update({(x, y): {"block" : Z_INDEX[0], "climate": climate}})
else:
floor.update({(x, y): EMPTY})
self.chunks.update({chunk: {"floor": floor, "items": items}})
self.unsaved += 1
这会创建如下内容:
self.chunks = {
(0,0): {
"floor": {
"block": 3,
"climate": (23, 15, 87)
},
"items": {
(2, 3): "rock"
}
}
}
创建块游戏最多需要半秒,这并不理想。有什么方法可以优化它以使其 运行 更快?像 numpy 函数之类的东西,或者一种线程化它并在后台使其成为 运行 的方法?
你可以看看 Numba 包。它是一个 JIT 编译器,使用 LLVM 编译器将 Python 代码转换为机器代码。只需在循环之前使用 @jit 装饰器,它可能会有所帮助。
http://numba.pydata.org
我正在开发一款拥有无限世界的游戏。我有这个功能可以在我需要的时候生成它的块,我只需要将块坐标传递给它,它就会创建一个块并将其存储在字典中。 这是函数:
def generate(self, chunkx, chunky):
# print("Generating chunk at", chunkx, chunky)
Z_INDEX = [0,1,2,3]
floor_void_diff = 60
mountain = floor_void_diff + 7
high_mountain = mountain + 6
factor = 1/200
biome_factor = 1/300
floor = {}
items = {}
chunk = (chunkx, chunky)
if chunk not in self.chunks:
# print("Generating chunk at {}".format(chunk))
for y in range(chunky * core["world_gen"]["chunksize"], chunky * core["world_gen"]["chunksize"] + core["world_gen"]["chunksize"]):
for x in range(chunkx * core["world_gen"]["chunksize"], chunkx * core["world_gen"]["chunksize"] + core["world_gen"]["chunksize"]):
temperature = create_noise(8, x, y, 0.5, biome_factor, 0, 100, self.n1)
humidity = create_noise(8, x, y, 0.5, biome_factor, 0, 100, self.n2)
altitude = create_noise(8, x, y, 0.5, biome_factor, 0, 100, self.n3)
climate = (temperature, altitude, humidity)
# gen_biome(climate)
i = create_noise(16, x, y, 0.5, factor, 0, 100, self.noise)
if i >= floor_void_diff:
if i >= mountain:
if i >= high_mountain:
floor.update({(x, y): {"block" : Z_INDEX[3], "climate": climate}})
else:
floor.update({(x, y): {"block" : Z_INDEX[2], "climate": climate}})
else:
floor.update({(x, y): {"block" : Z_INDEX[1], "climate": climate}})
spawner = random.randint(-1, core["world_gen"]["item_spawn"])
random_item = random.randint(0, len(core["item_list"])-1)
if spawner == 0:
items.update({(x, y): core["item_list"][random_item]})
elif i < floor_void_diff:
floor.update({(x, y): {"block" : Z_INDEX[0], "climate": climate}})
else:
floor.update({(x, y): EMPTY})
self.chunks.update({chunk: {"floor": floor, "items": items}})
self.unsaved += 1
这会创建如下内容:
self.chunks = {
(0,0): {
"floor": {
"block": 3,
"climate": (23, 15, 87)
},
"items": {
(2, 3): "rock"
}
}
}
创建块游戏最多需要半秒,这并不理想。有什么方法可以优化它以使其 运行 更快?像 numpy 函数之类的东西,或者一种线程化它并在后台使其成为 运行 的方法?
你可以看看 Numba 包。它是一个 JIT 编译器,使用 LLVM 编译器将 Python 代码转换为机器代码。只需在循环之前使用 @jit 装饰器,它可能会有所帮助。 http://numba.pydata.org