• Как максимально ускорить код?

    @kamenyuga
    Вот пример стандартного ускорения питонячего кода с помощью нампай и намбы, наверное, абсолютный максимум ускорения питона малой кровью, без серьезного рефакторинга. Результат ускорения - примерно в 500 раз. Абсолютное время работы кода не имеет смысла, т.к. напрямую зависит от производительности пк и параметров данных - количество, тип и т.д.

    import random
    import numba as nb
    import numpy as np
    
    
    def bubble1(array):
        len_ = len(array)
        for i in range(len_):
            for j in range(len_ - i - 1):
                if array[j] > array[j + 1]:
                    temp = array[j]
                    array[j] = array[j + 1]
                    array[j + 1] = temp
    
    
    @nb.njit(parallel=True)
    def bubble2(array):
        len_ = len(array)
        for i in nb.prange(len_):
            for j in nb.prange(len_ - i - 1):
                if array[j] > array[j+1]:
                    array[j], array[j + 1] = array[j + 1], array[j]
    
    
    if __name__ == '__main__':
    
        arr1 = random.choices(range(1000), k=1000)
        arr2 = np.array(arr1)
    
        bubble1(arr1)
        bubble2(arr2)
    
    """
    %timeit bubble1(arr1)
    46.1 ms ± 71.5 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    %timeit bubble2(arr2)
    82.4 µs ± 678 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    """
    Ответ написан
    Комментировать
  • Как поместиь виджеты в фрейм (tkinter)?

    @kamenyuga
    Не получается разместить виджеты в фрейм

    В приведенном коде f1 - это результат вызова метода pack(), который НЕ возвращает ссылку на фрэйм, а возвращает None. Это базовый синтаксис питона, переменной присваивается результат вызова функции.

    Не могу задать высоту и ширину фрейма

    Документация tk говорит, что "If you want to force the frame to have a specific width, call the .grid_propagate(0) on the widget". По дефолту ткинтер задает всем элементам минимальный требуемый размер, чтобы все поместилось, либо растягивает от минимального размера до размера окна, если указать, как растягивать. Ну, а если места не хватает, то начинаются сжатие, обрезка, невлезание в окно и т.д. В принципе, стандартное поведение многих десктопных гуишек.

    Для сколько-нибудь сложного гуи в ткинтере лучше, конечно, использовать .grid(...) - больше строк кода, но более гибкий и контролируемый результат. Грид - это сетка, у нее есть параметр минимального размера строки/столбца.

    import * - это плохо.
    Ответ написан
    Комментировать
  • Как разделить лазер?

    @kamenyuga
    1. То, что посоветовали в комментариях, - светоделительный кубик (High-Power, Laser Line, Polarizing Beamsplitter Cube) - практичный и рабочий вариант для лазерного света. У него есть набор характеристик - физический размер, рабочий диапазон длин волн, поляризация, - которые, конечно же, необходимо подбирать под конкретные условия. Альтернатива - то же самое, но в виде пластинки. Не очень понятны вопросы про смещения и погрешности. Преломление идет внутри кубика, а граница стекло-воздух пересекается под прямым углом. В профессиональных решениях отражение и рассеяние сведены к минимуму. 3 кубика разделят один луч на 4, а дальше зеркалами - это простейшая геометрия отражения света от зеркала. Естественно, что все оптические элементы необходимы разместить, закрепить, настроить. А лазеру хорошо бы светить в безвоздушной или хотя бы в непыльной среде.
    2. Делаем дырку, нарезаем резьбу, вкручиваем стекло в оправе. Дешевый сердитый вариант - делаем дырку, вклеиваем стекло. Кончено, хотелось бы, чтобы лазерный луч пересекал стекло под углом близким к прямому. Условия внутри камеры накладывают ограничения на конструкцию, а именно на клей, прочность стекляшки, прочность клеевого соединения. Если там внутри много жесткой пыли, то стеклу будет плохо, расцарапается, можно стекло менять, а можно его через переходник/кишку отодвинуть от стенки камеры наружу, чтобы пыль рядом со стеклом не летала.
    3. Конкретные варианты я бы начал смотреть в thorlabs.com (там очень много инфы доступно на сайте, своего рода справочник) или standa.lt.
    Ответ написан
  • Как решить проблему decode('utf-8') с debugger в PyCharm?

    @kamenyuga
    Одна из замечательных особенностей питончика состоит в том, что все питонячье в нем полностью открыто и доступно - объекты во время работы и код в читаемом тестовом виде. Так вот если открыть файл, указанный в сообщении об ошибке, - кстати для этого требуется один щелчок мышкой в пайчарме - то ровно перед проблемной строкой есть большое такое предупреждение про кодировку строк, а также отдельно упомянуты пайтон 2-ой версии и кодировка операционной системы. Внутри пайчарма только utf-8 и ничего больше. А винда до сих пор использует огромную россыпь кодировок, потому что utf-8 создан не майкрософтом, кириллица - это обычно windows-1251 в наше время.

    Так что пути решения проблемы очевидны - переходить на пайтон 3 и использовать только ascii символы в названиях папок и файлов. Вот второе условие не соблюдается. А в этом ли корень зла - не знаю.

    У меня, кстати, команда запуска пайчармовского дебаггера выглядит по-другому и нет проблем с кириллицей на windows 10. Так что, может, еще и способ запуска все портит. У меня нет вот этой части "C:\Python38\python.exe" и нет кавычек вокруг путей к файлам. Я использую виртуальные окружения, созданные в анаконде и указанные в свойствах проекта, а потом просто нажимаю на иконку зеленого жука для запуска дебаггинга.
    Ответ написан
    Комментировать
  • PyCharm UserFriendly для новичков?

    @kamenyuga
    Если коротко, то PyCharm - для тех, кто имеет опыт в разработке. А если подробнее, то дело тут не только в пайчарме, но и в пайтоне.

    Когда запускаешь просто файлик через стандартный питоновский айдл, то рабочей папкой является папка, где файл лежит. А в случае с пайчармом, рабочий каталог - это папка проекта. Вот так пайчарм управляет питоновской фичей. В свойствах проекта можно изменять набор папок, где будут искаться импортируемые модули. А можно просто сделать import src.mist_loader. Кроме того каждый новый запуск кода в пайчарме - это по дефолту новый чистый запуск интерпретатора.

    Для работы с нейросетями на питоне лучше всего использовать анаконду (или миниконду), в которой доступны среды разработки spyder и jupyter - менее гибкие, но довольно простые и дружелюбные к новичкам.
    Ответ написан
    Комментировать
  • Собираю комп: что на счёт ОЗУ и мат. платы?

    @kamenyuga
    Ситуация с возможностью разгона проца и памяти у Интела неоднозначная и меняется от поколения к поколению. В текущем только Z чипсет позволяет разгонять проц и память, на других чипсетах возможность разгона отключена. Соответственно, если материнка Z490, то можно и есть смысл брать процессоры с буквой К и память частотой выше, чем указана в описании процессора. А вот со всеми другими чипсетами анлокнутые процы и память с высокой частотой не имеют смысла, так как работать будут на указанных в описании частотах.

    Так что ответ на оба вопроса зависит от материнки.
    1. Если чипсет Z490, то смотреть можно любую память и проверять ее поддержку в описании материнки. Если чипсет другой, то только 2666 (ну, или что там в описании проца).
    2. Если процессор с буквой К, то логично брать к нему материнку Z490, иначе пропадает смысл этой самой буквы К. Возможность разгона памяти определяется чипсетом.
    Ответ написан
    2 комментария
  • Бюджетная водянка на процессор - стоит ли?

    @kamenyuga
    Я на почти такой проц (3600XT) поставил кулер Noctua NH-U12A со 120-мм вентиляторами в корпус мини-тауэр. Производительность на уровне очень неплохих китайских 140-мм кулеров, работать будет вечно, шумит слабее корпусных вентиляторов и видеокарты. Подсветки нет, вентиляторы на защелках, снимаются/надеваются за 10 секунд. Оперативку на закрывает никак, поэтому не может помешать. А вот ссд чтоб вытащить из материнки надо либо кулер снять, либо видеокарту вытащить. Установка заняла минуты три. Распаковывал я его дольше, чем устанавливал. Цена высокая - это да, но по мне в этом случае есть за что переплачивать.
    Ответ написан
    Комментировать
  • Какую оперативу брать на 10600k? и на MSI MPG Z490 Gaming Plus или там MSI Z490-A Pro?

    @kamenyuga
    У Интела буква К в названии процессора говорит о том, что его разрешено разгонять, а Z-чипсет разрешает разгонять оперативную память в отличии от более простых и дешевых чипсетов, где эта возможность отключена программно. Оптимальным выбором будет что-то вроде 3600@cl16 или лучше, насколько денег хватит. Лучше - это не только более высокая частота, но и более низкие тайминги, оба параметра влияют на производительность системы. В случае оперативки с супер параметрами обязательно необходимо проверить ее наличие в списке протестированных/поддерживаемых модулей оперативки на странице поддержки материнской платы, выбрав там планируемый процессор.
    Ответ написан
    7 комментариев
  • Какие колонки посоветуете?

    @kamenyuga
    Edifier R1280 - просто, годно, доступно. Сам пользую. Проблем не имею. Клеммы один раз подключил и больше не дергаю. Звук нормальный. Единственная не самая очевидная особенность - электронное управление громкостью (крутящаяся ручка), поэтому при отключении света в доме громкость сбрасывается на дефолтный низкий уровень.
    Ответ написан
  • Можно ли в Text выделять какие то слова? Если да, то как?

    @kamenyuga
    Вот, например, простой пример выделения цветом:
    def __create_problem_description_frame(self):
    
    	# здесь создаем сам виджет - self.problem_description_body
    	# self - это tk.Frame
    
    	# непосредственно вся логика
    	def f1(_event):
    
    		# ищем выделенный текст, но никак его не проверяем - одна буква или слово - без разницы
    		if self.problem_description_body.tag_ranges(tk.SEL):
    			print('SELECTED Text is %r' % self.problem_description_body.get(tk.SEL_FIRST, tk.SEL_LAST))
    		else:
    			print('NO Selected Text')
    			return
    
    		# в тексте ищем точные совпадения
    		pattern = str(self.problem_description_body.get(tk.SEL_FIRST, tk.SEL_LAST))
    
    		start = self.problem_description_body.index("1.0")
    		end = self.problem_description_body.index("end")
    		self.problem_description_body.mark_set("matchStart", start)
    		self.problem_description_body.mark_set("matchEnd", start)
    		self.problem_description_body.mark_set("searchLimit", end)
    
    		# как будем выделять - название тэга и желтый фон
    		self.problem_description_body.tag_configure("yellow", background="#ffff99")
    
    		# погнали искать все совпадения
    		count = tk.IntVar()
    		while True:
    			# непосредственно сам поиск
    			index = self.problem_description_body.search(
    				pattern, "matchEnd", "searchLimit", count=count, regexp=True)
    			if index == "":
    				break
    			if count.get() == 0:
    				break
    			# и, наконец, выделение найденного фрагмента текста тэгом с именем yellow
    			self.problem_description_body.mark_set("matchStart", index)
    			self.problem_description_body.mark_set("matchEnd", "%s+%sc" % (index, count.get()))
    			self.problem_description_body.tag_add("yellow", "matchStart", "matchEnd")
            
    	# биндим срабатывание на отпускание кнопки мыши 
    	self.problem_description_body.bind('<ButtonRelease-1>', f1)

    Проверено, что работает в питоне 3.7. Выделение происходит навсегда - здесь нет очистки выделения. Выделение - по отпусканию левой кнопки мыши на самом виджете. Ну, и, конечно, говнокодец - лишь бы заработало.
    Ответ написан
  • Как передать аргументы в функцию с помощью Tk?

    @kamenyuga
    Стандартный питонячий подход - обернуть вызов функции в лямбда-функцию:

    btn = ttk.Button(Button-1, lambda x=1, y=2: func(x, y))
    Ответ написан
  • Как занести данные в таблицу?

    @kamenyuga
    Тут явно проблемы в логике сравнения наборов значений. Зачем 2 цикла вместе с оператором in? Что-то явно лишнее - либо оператор, либо один из циклов. А то проверяется наличие строки в строке, а не в наборе строк.

    Вот пример исправления:
    # хотим отобрать фильмы с такими жанрами - хотя бы одним, но не обязательно всеми сразу
    genres_to_look_for = ['Drama', 'Crime']
    
    # вот набор фильмов и их жанров
    movies_and_genres = {
        1: ['Drama', 'Action', 'Crime', 'Thriller'],
        2: ['Drama'],
        3: ['Drama'],
        4: ['Comedy']}
    
    # для каждого фильма проверяем наличие у него искомых жанров (хотя бы одного)
    # если any заменить на all, то будет проверяться одновременное наличие всех искомых жанров
    movies_filtered = {
        movie: any((genre in genres) for genre in genres_to_look_for)
        for movie, genres in movies_and_genres.items()
        }
    
    print(movies_filtered)


    Получаем {1: True, 2: True, 3: True, 4: False} - прямо то, что надо, согласно моему пониманию задачи - в первых трех есть жанр drama, последний в пролете. А если использовать all, то получится {1: True, 2: False, 3: False, 4: False}.
    Ответ написан
    5 комментариев
  • Почему не срабатывают некоторые параметры pandas.read_excel?

    @kamenyuga
    convert_float - в pandas тип одинаков для всех значений в столбце - в столбце есть значение, которое нельзя преобразовать в int. Чаще всего такое бывает, когда в столбце пропущено значение, т.к. пустое значение - это нампаевский NaN типа float.

    parse_dates - передается список номеров или названий столбцов, которые необходимо распарсить в дату - отдельные столбцы или группы столбцов, если дата распределена по нескольким.

    date_parser - дефолтный парсер нормально работает, хотя и сильно увеличивает время загрузки данных. Имеет смысл парсить даты отдельно после загрузки, если объем большой.
    Ответ написан
    5 комментариев
  • Цикл for оставляет лишь последнюю строку из массива. Почему?

    @kamenyuga
    Работает ровно так, как и должно. Ибо Пайтон - язык динамический. Чтобы разобраться в проблеме, надо понимать как именно работают функции и их аргументы. (1) обычные аргументы резолвятся во время вызова функции, (2) дефолтные аргументы резолвятся во время определения функции, (3) нелокальные переменные внутри функции резолвятся во время работы функции (ищутся во внешнем или глобальном пространствах имен). Не соображу, какое слово подобрать вместо "резолвятся". Вот третий вариант и работает в приведенном коде, а должен работать второй.

    Следовательно, надо писать не так:
    lambda c: c.data == food

    а вот так:
    lambda c, food=food: c.data == food

    Ну, и простой пример для воспроизведения такого эффекта:

    from typing import List
    
    
    def f_1(lst: List) -> None:
    
        funcs = list()
        for val in lst:
            funcs.append(lambda: val)
        # цикл закончился, val имеет значение последнего элемента из списка
    
        for func in funcs:
            print(func())
    
    
    def f_2(lst: List) -> None:
    
        funcs = list()
        for val in lst:
            funcs.append(lambda val=val: val)
    
        for func in funcs:
            print(func())
    
    
    if __name__ == '__main__':
    
        data = ['apple', 'tomato', 'potato']
    
        print("\nf_1:")
        f_1(data)
    
        print("\nf_2:")
        f_2(data)
    Ответ написан
    Комментировать
  • Как создать сайт, чтобы в нем можно было программировать на python?

    @kamenyuga
    Годный пример реализации такой идеи - https://py3.codeskulptor.org/. Проект создан на основе https://skulpt.org/.
    Ответ написан
    Комментировать
  • Есть ли Python задачник?

    @kamenyuga
    Вот, например, бесплатный русскоязычный курс по основам Пайтона с большим количеством задач на курсэре: https://www.coursera.org/learn/python-osnovy-progr...

    Задачи, в основном, - это небольшие и несложные математические головоломки на базовый синтаксис Пайтона. Решения можно проверить также бесплатно в онлайн режиме.

    Там же есть набор курсов https://www.coursera.org/specializations/computer-... по основам разработки игр, структурам данных и алгоритмам - на Пайтоне, бесплатно, полностью в браузере, на английском языке. Так как бесплатно, то каждый курс надо брать отдельно, а не все вместе. Непосредственно задач на практику меньше, но дают много ссылок на всякие интересности, можно самому себе придумать практических упражнений в неограниченном количестве.

    Рекомендую для новичков. Потом уже можно переходить на серьезные книги, документацию и т.д. с минимумом болезненных ощущений.
    Ответ написан
    Комментировать
  • Как построить полиноминальный тренд?

    @kamenyuga
    Понадобилось сделать аппроксимацию полиномом m-й степени...
    Подозреваю ограничение точности double...
    В чём может быть проблема?

    При решении таких задач хорошо бы опираться не на подозрения, а на математику - Феномен Рунге. Эта тема обычно проходится в универах в рамках курсов по вычислительной математике (ах, какая нелепость это ваше высшее образование). Или можно хотя бы погуглить "интерполяция полиномами высоких степеней". Тема изучена вдоль и поперек уже сотню лет как.
    Ответ написан
    1 комментарий
  • Какой ноутбук из представленных выбрать?

    @kamenyuga
    У обоих вариантов 4ГБ опреативки и HDD, при этом предполагается, что
    будет использоваться для Photoshop, CorelDRAW, ...


    Я бы предложил поменять дискретную видеокарту на встроенную, при этом получить SSD и 8ГБ оперативной памяти, например:
    на АМД - https://www.citilink.ru/catalog/mobile/notebooks/1...
    на Интел - https://www.citilink.ru/catalog/mobile/notebooks/1...

    АМД чуть дешевле и немного мощнее.

    В игры, конечно, не поиграешь и апгрейд вряд ли возможен, но зато хоть какой-то уровень производительности на 2019 год. Небольшой объем SSD можно компенсировать внешним HDD. ОС у этих вариантов указана FreeDOS - не имею опыта с таким вариантом.
    Ответ написан
    2 комментария
  • Как установить драйвера USB 3 на Windows 7, если не работает клавиатура и мышь?

    @kamenyuga
    Была похожая проблема с установкой Win7 на современное железо, когда в установочном дистрибутиве не было нужных драйверов. Мне помог usb-контроллер - планка с USB портами, которая сама втыкается в PCIe слот на материнке.
    Ответ написан