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

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

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

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


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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.09.2021, 20:52
Ответы с готовыми решениями:

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

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

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

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

13
SkyJump
132 / 118 / 29
Регистрация: 09.07.2019
Сообщений: 1,070
Записей в блоге: 4
19.09.2021, 21:22 2
Используйте теги оформления кода:
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  [ТС] 3
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
5418 / 3842 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
19.09.2021, 21:46 4
Цитата Сообщение от STV_AL Посмотреть сообщение
долго что-то выполняется
Это не аргумент.
Покажи результат бенчмарков. Нормальных, а не через time.time.
Покажи данные на которых выполняется бенчмарк.

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

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

в PyCharm выдается правильный (предложенный) ответ, как ускорить не могу разобраться
0
1103 / 689 / 306
Регистрация: 05.09.2021
Сообщений: 1,197
19.09.2021, 21:53 6
Цитата Сообщение от STV_AL Посмотреть сообщение
в PyCharm выдается правильный (предложенный) ответ
А за какое примерно время код выполняется в PyCharm?
0
1 / 1 / 0
Регистрация: 04.11.2018
Сообщений: 23
19.09.2021, 22:04  [ТС] 7
1 мин 20
0
1488 / 1415 / 240
Регистрация: 19.02.2010
Сообщений: 3,921
19.09.2021, 23:12 8
Цитата Сообщение от STV_AL Посмотреть сообщение
как ускорить не могу разобраться
Независимо от ЯП, достаточно очевидное для всех умеющих программировать правило гласит: нефиг внутри цикла раз за разом (т.е. повторно) делать то, что не зависит от значения переменной цикла и/или от остальных изменяемых в цикле значений (если такие будут).
Не надо и внутри последовательного блока операторов дублировать вычисления. Этому приёму во всех школах учат, в средних классах (на алгебре, когда учат выносить общий множитель за скобки).

Конкретно - в calc_all_tfidf() на каждой (!) итерации тамошнего цикла ты дважды (!) открываешь-читаешь-раскладываешь на слова файл. Пройдись по дереву вызовов функций - увидишь.
1
1 / 1 / 0
Регистрация: 04.11.2018
Сообщений: 23
19.09.2021, 23:45  [ТС] 9
Подскажи, как исправить
0
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17593 / 10342 / 2826
Регистрация: 21.10.2017
Сообщений: 22,417
19.09.2021, 23:50 10
Цитата Сообщение от STV_AL Посмотреть сообщение
как исправить
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
нефиг внутри цикла раз за разом (т.е. повторно) делать то, что не зависит от значения переменной цикла и/или от остальных изменяемых в цикле значений (если такие будут).
Что непонятного-то?
0
1 / 1 / 0
Регистрация: 04.11.2018
Сообщений: 23
19.09.2021, 23:59  [ТС] 11
не понятно как реализовать, не все я понимаю в программировании, иногда кажется, что ни чего. Подскажешь?
0
Просто Лис
Эксперт Python
5759 / 3551 / 1063
Регистрация: 17.05.2012
Сообщений: 10,389
Записей в блоге: 9
20.09.2021, 07:49 12
Лучший ответ Сообщение было отмечено 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  [ТС] 13
Лис, ты крут!!! Спасибо!!!
0
Am I evil? Yes, I am!
Эксперт PythonЭксперт Java
17593 / 10342 / 2826
Регистрация: 21.10.2017
Сообщений: 22,417
20.09.2021, 20:06 14

Не по теме:

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


0
20.09.2021, 20:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.09.2021, 20:06
Помогаю со студенческими работами здесь

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

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

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

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

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

Оптимизация кода | requests
Доброго дня! Пытаюсь оптимизировать код и ускорить получния запрсов на сайт. Как смог...


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

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