Оптимизировать вложенный для l oop для генерации dict Python 3 - PullRequest
0 голосов
/ 06 августа 2020

Я разрабатываю игру с бесконечным миром. У меня есть эта функция для создания фрагментов, когда они мне нужны, и мне просто нужно передать ему координаты фрагмента, и он создаст и сохранит фрагмент внутри словаря. Это функция:

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 или способ передать это и заставить работать в фоновом режиме?

1 Ответ

0 голосов
/ 06 августа 2020

Вы можете посмотреть пакет Numba. Это JIT-компилятор, который преобразует код Python в машинный код с помощью компилятора LLVM. Просто используйте декоратор @jit перед l oop, и это может помочь. http://numba.pydata.org

...