Как реализован метод split ('\ n') в Python? - PullRequest
3 голосов
/ 14 апреля 2011

Это теоретический вопрос, чтобы понять разницу между Java и Python.Чтобы прочитать содержимое файла в массив в Java, вам нужно знать количество строк, чтобы определить размер массива при его объявлении.И поскольку вы не можете знать это заранее, вам нужно применить некоторые приемы для решения этой проблемы.

В Python списки могут быть любого размера, поэтому чтение содержимого файла в список может бытьсделано как:

lines = open('filename').read().split('\n')

или

lines = open('filename').readlines()

Как работает split ('\ n') в этом случае?Осуществляет ли реализация Python какие-то хитрости (например, удвоение размера массива при необходимости и т. Д.)?

Любая информация, проливающая свет на это, будет высоко оценена.

Ответы [ 5 ]

8 голосов
/ 14 апреля 2011

Реализация str.split() внутренне вызывает list.append(), что, в свою очередь, вызывает внутреннюю функцию list_resize().Из комментария в исходном коде этой функции:

Это перераспределяет пропорционально размеру списка, освобождая место для дополнительного роста.Перераспределение незначительно, но этого достаточно, чтобы обеспечить амортизацию линейного времени для длинной последовательности appends () при наличии плохо работающей системы realloc ().

Шаблон роста: 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...

1 голос
/ 25 октября 2011

Если вы ищете реальный код, реализующий его, попробуйте это: http://svn.python.org/view/python/trunk/Objects/stringlib/split.h?view=markup

Для "базового" разбиения начните осматривать линию 148.

Краткое резюме: они циклически перебирают строку в поисках определенного символа разделения, а затем добавляют к выходному кортежу строку между последней находкой и текущей (или началом строки для 1-го случая), используя «PyList_Append». В конце они добавляют остаток строки в кортеж.

У них есть заполнители для выделения большего пространства для кортежа результатов, когда он достигает текущего максимального размера, а также отдельные функции для проверки одного символа разделения по сравнению с другой строкой разделения (т. Е. Если вы хотите разделить на '/ t 'как два символа, вы можете, через отдельную функцию).

0 голосов
/ 14 апреля 2011

Вы можете проверить1) http://svn.python.org/view/python/trunk/Objects/listobject.c?view=markup2) http://svn.python.org/view/python/trunk/Include/listobject.h?view=markup

Короче говоря, Java: вектор :: Python: список

0 голосов
/ 14 апреля 2011

split( [sep [,maxsplit]])

Возвращает список слов в строке, используя sep в качестве строки-разделителя. Если задан maxsplit, то делится не более maxsplit. (таким образом, список будет иметь максимум maxsplit + 1 элемент). Если maxsplit не указан, то количество разделений не ограничено (делаются все возможные разбиения). Последовательные разделители не группируются вместе и считаются разделителями пустых строк (например,

'1„2'.split(',') возвращает ['1', '', '2'].

Аргумент sep может состоять из нескольких символов

например,

'1, 2, 3'.split(', ') возвращает ['1', '2', '3'].

Разделение пустой строки с указанным разделителем возвращает [''].

docs.python.org

0 голосов
/ 14 апреля 2011

Я думаю (хотя я не перепроверил код), что метод split () считает число новой строки в строке, а затем просто выделяет список правильного размера.

Тем не менее, все списки Python перераспределяются так, что их повторное добавление является амортизированным линейным временем.

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