Я не понимаю, как в этом случае вам поможет массив numpy.
В частности, любое преобразование структуры данных в другую (в вашем случае список кортежей в массиве NumPy или heapq) будет намного медленнее, чем поиск максимального значения, повторяющегося в каждом кортеже). Это связано с тем, что для преобразования структуры данных также потребуется выполнить итерации по сравнению с исходной, создать экземпляр объекта для новой структуры, сохранить значение в новой структуре и использовать новую структуру для получения запрошенного значения.
Использование встроенной функции или метода из вашего списка, скорее всего, приведет к более быстрым вычислениям. Самая тривиальная реализация, которую я могу придумать:
>>> li = [('a', 10), ('b', 30), ('c', 20)]
>>> max(li, key=lambda e : e[1])[0]
'b'
Другие возможные варианты, если вас также интересуют такие вещи, как наименьшее значение или удаление из списка найденного значения, которое может пройти через сортировку (поэтому вы проверяете исходный список только один раз!):
>>> li = [('a', 10), ('b', 30), ('c', 20)]
>>> li.sort(key=lambda e : e[1])
>>> li
[('a', 10), ('c', 20), ('b', 30)]
>>> li[-1][0]
'b'
Или:
>>> sorted(li, key=lambda e: e[1])[-1][0]
'b'
НТН!