Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 04.11.2018
Сообщений: 23

Оптимизация кода

19.09.2021, 20:52. Показов 2047. Ответов 13

Студворк — интернет-сервис помощи студентам
Коллеги, здравствуйте! Как можно оптимизировать код, долго что-то выполняется


import math
from collections import Counter

def read_data(data=True):
df = open('war_peace_processed.txt', 'rt').read()
if data:
return df.split('\n')
else:
df = df.split('[new chapter]')
return [i.split('\n') for i in df]

def df_calc(target_word):
corpus = read_data(data=False) # corpus
number_of_documents_with_target_word = 0
for chapter in corpus:
if target_word in chapter:
number_of_documents_with_target_word += 1
return number_of_documents_with_target_word / len(corpus)

def tf_calc(target_word, target_chapter):
corpus = read_data(data=False) # corpus
sum_word_in_chapter = 0
n_target_word_in_chapter = len(corpus[target_chapter])
for term in corpus[target_chapter]:
if term == target_word:
sum_word_in_chapter += 1
return sum_word_in_chapter / n_target_word_in_chapter

def tfidf(target_word, target_chapter):
tf = tf_calc(target_word, target_chapter)
idf = 1 / df_calc(target_word)
return math.log(1 + tf) * math.log(idf)

def calc_all_tfidf(target_chapter):
tfidf_dict = {}
corp = read_data(data=False)[target_chapter]
for w in corp:
tfidf_dict[w] = tfidf(w, target_chapter)
res = dict(Counter(tfidf_dict).most_common(5))
ds = {k: v for k, v in sorted(res.items(), key=lambda item: item[1])}
return list(ds.keys())[4:1:-1] (edited)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.09.2021, 20:52
Ответы с готовыми решениями:

Оптимизация кода
Добрый день! Я только учусь и столкнулся с такой проблемой: Задание на кодварсе следующее: есть целые числа от m до n включительно. Нужно...

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

Оптимизация кода
Мы будем работать с набором слов. Ваша задача — выписать все слова, которые являются анаграммами друг для друга, например «замок» и...

13
 Аватар для GulgDev
132 / 118 / 29
Регистрация: 09.07.2019
Сообщений: 1,071
19.09.2021, 21:22
Используйте теги оформления кода:
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
30
31
32
33
34
35
36
37
38
39
40
41
import math
from collections import Counter
 
def read_data(data=True):
    df = open('war_peace_processed.txt', 'rt').read()
    if data:
        return df.split('\n')
    else:
        df = df.split('[new chapter]')
        return [i.split('\n') for i in df]
 
def df_calc(target_word):
    corpus = read_data(data=False) # corpus
    number_of_documents_with_target_word = 0
    for chapter in corpus:
        if target_word in chapter:
            number_of_documents_with_target_word += 1
    return number_of_documents_with_target_word / len(corpus)
 
def tf_calc(target_word, target_chapter):
    corpus = read_data(data=False) # corpus
    sum_word_in_chapter = 0
    n_target_word_in_chapter = len(corpus[target_chapter])
    for term in corpus[target_chapter]:
        if term == target_word:
            sum_word_in_chapter += 1
    return sum_word_in_chapter / n_target_word_in_chapter
 
def tfidf(target_word, target_chapter):
    tf = tf_calc(target_word, target_chapter)
    idf = 1 / df_calc(target_word)
    return math.log(1 + tf) * math.log(idf)
 
def calc_all_tfidf(target_chapter):
    tfidf_dict = {}
    corp = read_data(data=False)[target_chapter]
    for w in corp:
        tfidf_dict[w] = tfidf(w, target_chapter)
        res = dict(Counter(tfidf_dict).most_common(5))
        ds = {k: v for k, v in sorted(res.items(), key=lambda item: item[1])}
    return list(ds.keys())[4:1:-1] (edited)
Добавлено через 1 минуту
И конкретизируйте свой вопрос: опишите, что должен делать код.
2
1 / 1 / 0
Регистрация: 04.11.2018
Сообщений: 23
19.09.2021, 21:42  [ТС]
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import math
from collections import Counter
 
 
def read_data(data=True):
    df = open('war_peace_processed.txt', 'rt').read()
    if data:
        return df.split('\n')
    else:
        df = df.split('[new chapter]')
        return [i.split('\n') for i in df]
 
 
def df_calc(target_word):
    corpus = read_data(data=False)  # corpus
    number_of_documents_with_target_word = 0
    for chapter in corpus:
        if target_word in chapter:
            number_of_documents_with_target_word += 1
    return number_of_documents_with_target_word / len(corpus)
 
 
def tf_calc(target_word, target_chapter):
    corpus = read_data(data=False)  # corpus
    sum_word_in_chapter = 0
    n_target_word_in_chapter = len(corpus[target_chapter])
    for term in corpus[target_chapter]:
        if term == target_word:
            sum_word_in_chapter += 1
    return sum_word_in_chapter / n_target_word_in_chapter
 
 
def tfidf(target_word, target_chapter):
    tf = tf_calc(target_word, target_chapter)
    idf = 1 / df_calc(target_word)
    return math.log(1 + tf) * math.log(idf)
 
 
def calc_all_tfidf(target_chapter):
    tfidf_dict = {}
    corp = read_data(data=False)[target_chapter]
    for w in corp:
        tfidf_dict[w] = tfidf(w, target_chapter)
    res = dict(Counter(tfidf_dict).most_common(5))
    ds = {k: v for k, v in sorted(res.items(), key=lambda item: item[1])}
    return list(ds.keys())[4:1:-1]
Код реализует алгоритм расчета метрики tf-idf. Функция calc_all_tfidf выводит три слова, отсортированные по убыванию данной метрики. Но он делает это медленно, может быть кто-то поопытнее, чем я, подскажет как можно оптимизировать код по скорости выполнения
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
19.09.2021, 21:46
Цитата Сообщение от STV_AL Посмотреть сообщение
долго что-то выполняется
Это не аргумент.
Покажи результат бенчмарков. Нормальных, а не через time.time.
Покажи данные на которых выполняется бенчмарк.

P.S.И сразу скажи откуда скопипастил код, чтобы у нас не было иллюзий.
0
1 / 1 / 0
Регистрация: 04.11.2018
Сообщений: 23
19.09.2021, 21:51  [ТС]
Задача выглядит так: напишите код, который выведет на экран через пробел три слова, имеющие самое высокое значение tf*idf в заданной главе target_chapter в порядке убывания tf*idf.

Дело в том, что проверка данного кода выполняется грейдером на платформе SkillFactory, вот этот самый грейдер выдает ошибку: Code error: Exception('Timed out!',)

в PyCharm выдается правильный (предложенный) ответ, как ускорить не могу разобраться
0
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
19.09.2021, 21:53
Цитата Сообщение от STV_AL Посмотреть сообщение
в PyCharm выдается правильный (предложенный) ответ
А за какое примерно время код выполняется в PyCharm?
0
1 / 1 / 0
Регистрация: 04.11.2018
Сообщений: 23
19.09.2021, 22:04  [ТС]
1 мин 20
0
2625 / 1636 / 266
Регистрация: 19.02.2010
Сообщений: 4,348
19.09.2021, 23:12
Цитата Сообщение от STV_AL Посмотреть сообщение
как ускорить не могу разобраться
Независимо от ЯП, достаточно очевидное для всех умеющих программировать правило гласит: нефиг внутри цикла раз за разом (т.е. повторно) делать то, что не зависит от значения переменной цикла и/или от остальных изменяемых в цикле значений (если такие будут).
Не надо и внутри последовательного блока операторов дублировать вычисления. Этому приёму во всех школах учат, в средних классах (на алгебре, когда учат выносить общий множитель за скобки).

Конкретно - в calc_all_tfidf() на каждой (!) итерации тамошнего цикла ты дважды (!) открываешь-читаешь-раскладываешь на слова файл. Пройдись по дереву вызовов функций - увидишь.
1
1 / 1 / 0
Регистрация: 04.11.2018
Сообщений: 23
19.09.2021, 23:45  [ТС]
Подскажи, как исправить
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
19.09.2021, 23:50
Цитата Сообщение от STV_AL Посмотреть сообщение
как исправить
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
нефиг внутри цикла раз за разом (т.е. повторно) делать то, что не зависит от значения переменной цикла и/или от остальных изменяемых в цикле значений (если такие будут).
Что непонятного-то?
0
1 / 1 / 0
Регистрация: 04.11.2018
Сообщений: 23
19.09.2021, 23:59  [ТС]
не понятно как реализовать, не все я понимаю в программировании, иногда кажется, что ни чего. Подскажешь?
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
20.09.2021, 07:49
Лучший ответ Сообщение было отмечено STV_AL как решение

Решение

Не по теме:

переменная df меня чуть не отпугнула и почти заставила закрыть вкладку



Ну во-первых закешируй текст.

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
def get_corpus():
    with open('war_peace_processed.txt', 'r') as f:
        return [i.split('\n') for i in f.read().split('[new chapter]')]
 
 
def df_calc(corpus, target_word):
    number_of_documents_with_target_word = 0
    for chapter in corpus:
        if target_word in chapter:
            number_of_documents_with_target_word += 1
    return number_of_documents_with_target_word / len(corpus)
 
 
def tf_calc(corpus, target_word, target_chapter):
    sum_word_in_chapter = 0
    n_target_word_in_chapter = len(corpus[target_chapter])
    for term in corpus[target_chapter]:
        if term == target_word:
            sum_word_in_chapter += 1
    return sum_word_in_chapter / n_target_word_in_chapter
 
 
def tfidf(corpus, target_word, target_chapter):
    tf = tf_calc(corpus, target_word, target_chapter)
    idf = 1 / df_calc(corpus, target_word)
    return math.log(1 + tf) * math.log(idf)
2
1 / 1 / 0
Регистрация: 04.11.2018
Сообщений: 23
20.09.2021, 20:04  [ТС]
Лис, ты крут!!! Спасибо!!!
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
20.09.2021, 20:06

Не по теме:

Цитата Сообщение от STV_AL Посмотреть сообщение
Лис, ты крут!!!
Подписываюсь!


0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.09.2021, 20:06
Помогаю со студенческими работами здесь

Оптимизация кода
Оптимизируйте пожалуйста эти коды: s = input() res = set() for i in range(len(s)): for j in range(i, len(s)): if sum(...

Оптимизация кода
это код, который ищет в тексте пользователя самое большое расстояние между двумя одинаковыми символами, как его можно оптимизировать? ...

Оптимизация скорости кода
a=2 b=3 c=5 d=50 your=int(input("Введите ваш баланс:")) def proga(x): for i in range(0,x+1): for w in range(0,x+1): ...

Оптимизация кода по времени
Есть задача. Всем известно, что со временем клавиатура изнашивается, и клавиши на ней начинают залипать. Конечно, некоторое время такую...

Python. Оптимизация кода
Здравствуйте всем! Я недавно начал заниматься питоном и во время решения одной из моих задач, столкнулся с проблемой. Код, слишком...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru