Python3 объект с объектом в своем списке занимает больше времени, чем один без - PullRequest
0 голосов
/ 01 мая 2018

Вопрос: По какой-то странной причине, get_dispChar занимает почти 400 миллисекунд для вызова только тогда, когда resourceList имеет 1 или более объекта Resource. Почему это происходит и как я могу это исправить?

Мой класс TerrainTile имеет следующий конструктор

class TerrainTile:
    def __init__(self):
        self.tileX = 0               #world x coord
        self.tileY = 0               #world y coord
        self.elevation = 0           #int from 0-100, tells how high the highest point on the tile is
        self.symbol = '?'
        self.fgCol = [0,0,0,0]
        self.bkCol = [0,0,0,0]
        self.resourceList = []       #list of resource objects
        self.buildingList = []       #list of building objects
        self.accessibility = 0       #int from 0 - 128 determing maximum building size total on plot
        self.highestDispPriority = 0 #for displaying resources or buildings
        return

self.symbol определяется следующим:

# determine if a resource OR building on the tile has a more important symbol and color to display
    for rs in self.resourceList:
        if(int(rs.get_dispPriority()) > self.highestDispPriority):
            self.fgCol = rs.get_color()
            self.symbol = rs.get_symbol()
    return

И символ, полученный из этой функции:

def get_dispChar (self):
    #print("Printing: ",self.symbol)
    return self.symbol

По какой-то странной причине, get_dispChar требует почти 400 миллисекунд для вызова только тогда, когда resourceList содержит 1 или более объекта Resource. Почему это происходит и как я могу это исправить? Определение объекта ресурса немного усложняется, потому что я загружаюсь из XML-файла, но вот конструктор для класса Resource.

#initialization of Resource
def __init__(self, name, itemID, companyID, quantity, volumePerUnit, valuePerUnit, color, symbol, dispPriority, isDiscovered):
    self.name = name
    self.itemID = itemID
    self.companyID = companyID
    self.quantity = quantity
    self.volumePerUnit = volumePerUnit
    self.valuePerUnit = valuePerUnit
    self.color = color
    self.symbol = symbol
    self.dispPriority = dispPriority
    self.isDiscovered = isDiscovered

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

Заранее спасибо!

Я пройду и проверим время, если тебе понадобится их

Вот таблица с указанием времени, которое требуется для вызова get_dispChar из TerrainTiles

#Moving into main game loop
0.0                      #how long it takes to call get_dispChar when the object does NOT have an object in resourceList
0.6212029457092285       #how long it takes to call get_dispChar when the object DOES have an object in resourceList

1 Ответ

0 голосов
/ 01 мая 2018

РЕШЕНИЕ

Я нашел решение! Чтобы создать список цветов, я извлекаю данные из XML-файла, показанного здесь>

<collection col = "resources">
    <item name='lumber'>
        <itemId>1</itemId>
        <volumePerUnit>5</volumePerUnit>
        <valuePerUnit>10</valuePerUnit>
        <symbol>T</symbol>
        <color1>255</color1>
        <color2>138</color2>
        <color3>88</color3>
        <color4>38</color4>
        <dispPriority>5</dispPriority>
        <isDiscovered>1</isDiscovered>
    </item>
</collection>

Когда я извлекал значение color [n] из XML-файла, я извлекал его как строку, а не как целое число. Показано здесь:

fgCol = item.getElementsByTagName('color1')[0]
color[0] = fgCol.childNodes[0].data
fgCol = item.getElementsByTagName('color2')[0]
color[1] = fgCol.childNodes[0].data
fgCol = item.getElementsByTagName('color3')[0]
color[2] = fgCol.childNodes[0].data
fgCol = item.getElementsByTagName('color4')[0]
color[3] = fgCol.childNodes[0].data

Оказывается, python3 не любит сообщать пользователю, когда используется строка, а не int. Функция, которую я использовал для преобразования списка в используемый тип цвета, требовала использования целых чисел, а не строк. Чтобы исправить это, я добавил int() к значениям, чтобы получить это:

fgCol = item.getElementsByTagName('color1')[0]
color[0] = int(fgCol.childNodes[0].data)
fgCol = item.getElementsByTagName('color2')[0]
color[1] = int(fgCol.childNodes[0].data)
fgCol = item.getElementsByTagName('color3')[0]
color[2] = int(fgCol.childNodes[0].data)
fgCol = item.getElementsByTagName('color4')[0]
color[3] = int(fgCol.childNodes[0].data)

Что отнять у этого как у читателя

Модуль time в python буквально спасает жизнь. Я использовал его для отслеживания того, сколько времени занимала каждая операция в моем коде, пока я не обнаружил, что одна из них затягивает вычислительное время.

Чтобы сделать этот вопрос продуктивным для тех, кто в будущем, используйте модуль time !! Вот мой код с проблемой:

terminal.color(finForCol)
terminal.bkcolor(finBackCol)
terminal.put(cursorX, cursorY, symbol)

Оказывается, метод terminal.color() метод выдает ошибку, когда задан список строк, а не целых чисел. Я бы никогда не нашел этого, если бы не проверял время каждой операции. Спасибо тем, кто помогает, и я все равно с удовольствием приму предложения по улучшению моего кода, спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...