0 / 0 / 0
Регистрация: 04.08.2017
Сообщений: 28
1

Как работает len() в Python

05.07.2019, 20:50. Показов 12163. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как работает len() в Python . Я хочу использовать бинарный поиск , но для него надо использовать len() чтоб найти длину массива. Я думаю , что len() работает по принципу того что он считает каждый элемент в массиве. То есть если в массиве миллиард значений , то ему понадобиться миллиард операций? Если так , то смысл делать бинарный поиск , ведь он ещё накинет вычислений компьютеру . Можно ж просто по очереди проверят массив . Так будет меньше вычислений чем с бинарным поиском.
Вообщем, объясните новичку как работает len() и насколько он ресурсозатратный . Я думаю что бинарный поиск используют не по приколу, а для оптимизации поиска.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2019, 20:50
Ответы с готовыми решениями:

Как создать двумерный массив размерностью len(list2) * len(list1)+1 и массив должен быть заполнен нулями
как создать двумерный массив размерностью len(list2) * len(list1)+1 и массив должен быть заполнен...

Python перегрузка len
в классе пытаюсь перегрузить оператор def __len__(self): return (self.n, self.m) ...

Сравнить len(str) и len(int)
Возможни ли сравнить длину int и длину str ? и как это сделать. Спасибо! Из стандартного...

В Python есть встроенная функция len, которая возвращает длину строки
В Python есть встроенная функция len, которая возвращает длину строки. Например, значение len...

Описать функцию FillStr(S,Len), возвращающую строку длины Len, заполненную повторяющимися копиями строки-шаблона S
Описать функцию FillStr(S,Len) строкового типа, возвращающую строку длины Len, заполненную...

6
Автоматизируй это!
Эксперт Python
7107 / 4610 / 1215
Регистрация: 30.03.2015
Сообщений: 13,236
Записей в блоге: 29
05.07.2019, 21:01 2
Цитата Сообщение от Vlad576 Посмотреть сообщение
Я думаю , что len() работает по принципу того что он считает каждый элемент в массиве.
если под массивом ты имеешь в виду лист, то нет,не считает, знает сразу и как бы ты не менял лист, запрос за его размером выполнится за О(1)
пруфы
0
Эксперт Python
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
06.07.2019, 00:10 3
Цитата Сообщение от Vlad576 Посмотреть сообщение
То есть если в массиве миллиард значений , то ему понадобиться миллиард операций?
Интересно, в каких это языках вы видели такую реализацию встроенной функции? (Кроме С\С++ - там свои особенности)
В lua, например, да, придется делать именно так... но только потому что там таблицы "дырявые" и встроенный оператор # выводит число элементов до первой "дырки" .
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
06.07.2019, 08:07 4
Цитата Сообщение от Vlad576 Посмотреть сообщение
Вообщем, объясните новичку как работает len()
Идем в исходники, находим функцию list_length:
https://github.com/python/cpyt... ect.c#L391

Видим, что реализована она через макрос Py_SIZE, находим его:
https://github.com/python/cpyt... ect.h#L119

Простое обращение к полю структуры, никаких обходов списка.
1
Фрилансер
3705 / 2077 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
06.07.2019, 08:31 5
Цитата Сообщение от Vlad576 Посмотреть сообщение
Я хочу использовать бинарный поиск
Есть готовый бинарный поиск в модуле bisect
0
Модератор
Эксперт Python
1356 / 653 / 207
Регистрация: 23.03.2014
Сообщений: 3,057
06.07.2019, 17:42 6
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from random import randint
 
# Создание списка,
# его сортировка по возрастанию
# и вывод на экран
a = []
for i in range(15):
    a.append(randint(1, 50))
a.sort()
print(a)
 
# искомое число
value = int(input())
 
mid = len(a) // 2
low = 0
high = len(a) - 1
 
while a[mid] != value and low <= high:
    if value > a[mid]:
        low = mid + 1
    else:
        high = mid - 1
    mid = (low + high) // 2
 
if low > high:
    print("No value")
else:
    print("ID =", mid)
Добавлено через 12 минут
Пример с bisect
Python
1
2
3
4
5
from bisect import bisect_left
def binary_search(a, x, lo=0, hi=None):
    hi = hi if hi is not None else len(a)
    pos = bisect_left(a, x, lo, hi)
    return (pos if pos != hi and a[pos] == x else -1)
0
1728 / 968 / 199
Регистрация: 22.02.2018
Сообщений: 2,694
Записей в блоге: 6
06.07.2019, 19:40 7
Цитата Сообщение от Vlad576 Посмотреть сообщение
то ему понадобиться миллиард операций?
Каждая операция, если считать добавляя по одному, это одна операция процессора. Процессор выполняет больше 3-х миллиардов операций в сек. Даже если бы он считал количество элементов именно так, то на подсчет 1-го миллиарда элементов он потратил бы 0.3 сек. Для Вас это много? Однако же, как показал 0x10, питон оптимизирует этот подсчет. Не понятно вообще, почему у Вас возник такой вопрос. Что, Ваш код медленно работает? Так причина может быть совсем не в этом, Вы же не показали свой код.
0
06.07.2019, 19:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.07.2019, 19:40
Помогаю со студенческими работами здесь

Описать функцию FillStr(S,Len), возвращающую строку длины Len, заполненную повторяющимися копиями строки-шаблона S
Описать функцию FillStr(S,C,Len), заполняющую строку S длины Len повторяющимися копиями...

ValidationRule: Len(Trim([Country])) > 0 не работает!
Здравствуйте, уважаемые! У меня такая проблема... Есть mdb база. В ней таблица, а в таблице поле...

Как вернуть слово после того, как через len определил его длину?
Помогите, пожалуйста, не могу додуматься, как после того, как с помощью len определил самое длинное...

Можно ли как-то просто обратиться к символу в строке, кроме как Mid(str,pos,len)?
Ну типа как к элементу в массиве, например MyStr

Как узнать количество элементов без len
Привет, помогите пожалуйста с вариантом решения задачи: напишите функцию, дублирующую функционал ну...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru