1. Python / Говнокод #13904

    −100

    1. 1
    2/3

    ПИТОНОПРОБЛЕМЫ ;)

    P.S. Да, я читал доки. Не меня в них тыкать носом.

    Запостил: bormand, 07 Октября 2013

    Комментарии (93) RSS

    • 0.6(6) полагаю? Не уж то старые сишники батхертят?

      >Не меня в них тыкать носом.
      А кого? Есть предложения?
      Ответить
      • > 0.6(6) полагаю?
        вам идёт ваш ник
        Ответить
        • http://ideone.com/DyXhyk
          Ещё вопрос кому он больше идет.
          Ответить
          • http://ideone.com/h4CzMm
            А чё. Переносимо.
            Ответить
            • Ну они же сами говорили, что они сильно ломают совместимость в угоду развития языка разок. Главное чтобы дальше такого не повторялось.
              Ответить
              • Да правильно. Я потому и не плюсовал.
                Всех предупредили заранее. Но и не минусовал, т.к. 2/3 намёк (не знаю борманд осознанно так написал) что третья версия делит вторую.
                Ответить
          • Ага, а теперь пробуем в python 2.x
            Ответить
            • Вам уже пора выкинуть это старьё.
              Ответить
              • обоснуйте, если 2.7 то не думаю что это старье.

                2/float(3) Это вроде-бы к 2 версии относиться.
                Ответить
            • from future import (все что там есть)?
              Ответить
    • > 2/3

      я правильно понимаю что проблема в том что на питоне 2 это 0, на 3ке это 0.6(6)?

      медленно начинаю понимать почему перл с самого начала в лоб все подобное во флоаты автоматом конвертит.
      Ответить
      • > все подобное во флоаты автоматом конвертит
        Это тоже не фонтан. Мне больше всего нравится, как это сделано в Haskell. Числовые литералы там полиморфны, и выражение 2/3 будет иметь тип из класса Fractional (Float или Double в зависимости от контекста). Если же тип точно известен и это Int или Integer, оператор / для них не определён, нужно явно конвертировать во float. Для деления с остатком есть div, mod и divMod.

        Подход OCaml с отдельными набороми операторов меня слегка бесит.
        Ответить
        • "Числовые литералы там полиморфны, и выражение 2/3 будет иметь тип из класса Fractional (Float или Double в зависимости от контекста)."

          пахнет лиспом.

          честно скажу что как оно в перле точно я не ковырял. но мое впечатление что деление всегда конвертит во флоат. все остальные операции - только если происходит переполнение. официально даже и разницу узнать нельзя, внутренее представление числа int или float. все таки как бы не математический язык: вычисление выражений делается тупой интерпретацией и уже производительность наталкивает на мысли.
          Ответить
          • > во флоат
            Даже комплексные числа? :(
            Ответить
          • Совсем нет. Лисп очень лояльно (в отличие от Каслеля) относится к типам. Полиморфные типы там на уровне языка не существуют, да и нет в них надобности.
            Проблемы с семантикой деления решаются примерно так:

            (declaim (inline int-div))
            (defun int-div (a b)
              (declare (type integer a b))
              ;; One should really use (floor a b) This is only an example
              (/ a b))
            
            (defun test-int-div (a b)
              (declare (type integer a b)
                       (ftype (function (integer integer) integer) int-div))
              (int-div a b))

            Что делает это очень многословным, но с другой стороны, как правило можно ограничиться только указанием типов аргументов, компилятор сам выберет нужную реализацию.
            Ответить
          • В книжке автор говорит, что флоаты в perl везде.
            Ответить
            • может быть в ранних версиях. с другой стороны тебе то по барабану каким внутренним типом данные представлены, если работает верно.

              попробуй:
              perl -mDevel::Peek=Dump -e '$a=1; $b=1.0; Dump($a); Dump($b);'

              на 5.8/5.10: первая `IV` - это int value, вторая `NV` - это "number" value (aka float).
              Ответить
        • > есть div, mod и divMod
          Причем не только div и mod, которые округляют вниз (что удобно для всяких тайлов), но и rem с quot'ом, которые округляют к нулю (аля интелоделение).

          P.S. В питоне тоже сделали div, но назвали его, имхо, стремно: "//". Имхо, div был бы наглядней, чем эти джве палки.
          Ответить
          • И кстати, quotRem быстрее работает, так что для беззнаковых лучше использовать его.
            Ответить
        • Ада:
          i : integer := 2/3; -- ноль
          f1 : float := 2/3; -- ошибка компиляции
          f2 : float := float(2/3); -- ноль
          f3 : float := float(2)/float(3); -- 0.6666666666666666
          Ответить
          • Вахканалия какая-то.
            Ответить
            • нет, всё по делу, всё по правилам строжайшей типизации
              Ответить
              • На 2.0 / 3 тоже ошибка компиляции будет?
                Ответить
                • Да.
                  Типы-то разные, делить нельзя.
                  А неявные преобразования запрещены нафиг.
                  Ответить
                  • > неявные преобразования запрещены нафиг
                    И это хорошо.
                    Ответить
          • Я раньше тоже бугуртил от фшарпа с подобными правилами. А теперь понял - оно хорошо.
            Ответить
    • показать все, что скрытоУ МИНЯ ЕСТЬ IFON 5S НО Я ЖЫ НИ ХВАСТАЮЗЬ!!!!!!!!!!!!!
      Ответить
    • >ПИТОНОПРОБЛЕМЫ ;)
      Ээ покажи мне язык, который себя по другому ведет. В новых питонах от этой сишной хуйни с привязкой к типам решили избавиться и сделать логичный, калькуляторный div.
      Ответить
      • Есть старперы, типа Романа. У них это всегда будет вызывать дисконфорт в задней части тела.
        Ответить
        • >>У них это всегда будет вызывать дискомфорт

          >>в задней части тела

          В спине?
          Ответить
      • > Ээ покажи мне язык, который себя по другому ведет.
        Яваскрипт, похапешечка?

        > сишной хуйни
        Да на сишке это еще не так страшно было... в сишкоподобных языках тип же заранее известен, и деление или всегда флоатовое, или всегда целочисленное. А тут оно зависит от данных: ввел юзер 2.0 - флоаты, ввел 42 - инты. Что вызывает батхерты и заставляет делать лишние касты во флоат.

        > В новых питонах
        Ну вот в третьем да, все нормально.
        Ответить
        • >язык
          >Яваскрипт, похапешечка?
          /0. Слабая типизация не нужна.

          >А тут оно зависит от данных: ввел юзер 2.0 - флоаты, ввел 42 - инты. Что вызывает батхерты и заставляет делать лишние касты во флоат.
          Батхерты такого рода оно вызывает у мудачья, использующего input() вместо raw_input(). Алсо, from __future__ import четотам.
          Ответить
          • > raw_input
            Ну числа же не только из консолечки читают...

            Может быть мы пишем библиотечную функцию, которая принимает некое число, и потом что-то с ним делает. И юзер вместо положенного флоата передает туда int.
            Ответить
            • Это же получается если написать input()/input(), то в старом питончике мог получится прикольный результат для пользователя твоей недопроги. А если программа считает что-то посложнее, то пользователь даже и не заметит как ошибся.
              Ответить
              • >Это же получается если написать input()/input()
                input() = eval(raw_input). Продолжать? Из тройки его в таком виде убрали.
                Ответить
            • Люди, которые пишут библиотечные функции, такие нюансы знают.
              Ответить
    • Так я не пойму, от чего батхерт - от того, что двойка ведет себя как C/Java, что тройка ведет себя как калькулятор или от того, что они ведут себя по разному (__future__, конечно же, ниасилили)?
      Ответить
      • Подозреваю, баттхёрт от того, что вместе с версией язык поменял семантику фундаментальных операций. От этого может поломаться туева хуча кода. А найти такие баги может быть офигеть как сложно, особенно учитывая, что люди в среднем не особо любят писать тесты.

        > __future__, конечно же, ниасилили
        Это более-менее подходит если ты пишешь 2.x код, ориентируясь на возможный переход на 3-ку. Для портирования существующего легаси это бесполезно.
        Ответить
        • Python 3.5:
          added __past__ for legacy code support
          Ответить
        • >От этого может поломаться туева хуча кода.
          Он от этого просто так не поломается, т.к. код из двойки просто так на тройке не запустится хотя бы из-за print, а те, кто портируют - такие нюансы знают (google: различие между двойкой и тройкой)

          То, что вам кажется проблемами, на самом деле - хуйня собачья и верхушка айсберга, который вы по незнанию не видите. Сразу видно, что ничего не портировали. Например, пропал "".(en|de)code('hex'), его запиздочили в codecs. bytes внезапно! сделали массивом интов, а не символов. Пропал оператор форматирование "%s" % "a". "".format() для байтов не работает.
          >>> "{}".format(b'')
          "b''"
          Ответить
          • > Сразу видно, что ничего не портировали.
            Я прочитал последний Dive into Python, там в деталях описано, как происходит портирование. Это вызвало у меня такой батхёрт, что я просто для личных целей продолжаю пользоваться 2.x, игнорируя 3.x.

            Ну и вообще странно, что вещи из топика нету в 2to3.
            Ответить
            • >Я прочитал последний Dive into Python, там в деталях описано, как происходит портирование. Это вызвало у меня такой батхёрт,
              Что-то такое есть :) Но твой батхерт имеет мало общего с реальностью, т.е. у людей, реально работающими с этим, батхерт вызывает другое.

              Ну и насчет 2to3 - фитон - не жавка, где в эклипсе можно методы мышкой перетаскивать. Тут в статике вообще нихуя не работает.
              Ответить
            • Батхерт вызывают люди использующие именованые кортежи, аннотации и другой подобный сахар, не взирая на версию языка. Хз зачем это все понавводили.
              Ответить
              • >Хз зачем это все понавводили.
                именованые кортежи, аннотации и другой подобный сахар?
                Ответить
    • целочисленное деление же
      Ответить
      • В котором из питонов? :)
        Ответить
        • в новеньком, для увеличения производительности же. возбудились жабой.
          Ответить
          • А вот и хуй :) Наоборот.
            Ответить
            • tits or gtfo пруф или не было

              конструктивно: все-таки, где раньше было реализовано?
              Ответить
              • Покажи свою попку и я тебя трахну
                Ответить
                • т.е. ты расписываешься в том, что ты - пидарас.
                  мило.
                  от недостатка шлюх желать трахать все, хоть эл.розетку.
                  Ответить
              • Вверху треда народ запостил вот эти ссылки с пруфами:
                2.0: http://ideone.com/h4CzMm
                3.0: http://ideone.com/DyXhyk

                В тройке решили сделать более интуитивное поведение. А для целых чисел сделали специальный оператор // (хотя, имхо, лучше бы они назвали его div, а не этой фигней с двумя палками).
                Ответить
            • Юноша, помойте рот с мылом
              Ответить
          • >производительности
            >фитон
            /0

            Целочисленное деление - изобретение байтоёбов.
            Ответить
            • да хватит уже с байто- и такто- ебством.
              сейчас уже важно распараллелирование на ядра, нежели отставание байткода от нативного.
              как никогда актуально знание алгоритмов, их сложность и тактикак assParallel (простите, не удержался)

              оффтоп: мне сегодня доказывали, что расспареливование на низком уровне дискредитирует всю 20-летнюю теорию сложности алгоритмов, ибо это вносит хаос в однопотоковый подсчет сложности
              Ответить
              • Ага, вот только питон как раз не параллелится из-за GIL, от которого навряд ли в ближайшее время избавятся.
                Впрочем, тем временем в проекте PyPy ставят эксперименты с транзакционнной памятью, которая новыми процессорами будет поддерживаться аппаратно. Поживем - увидим.
                Ответить
                • Питон параллолится мультипроцессингом, который на венде не в тему, да.
                  Ответить
              • > мне сегодня доказывали, что расспареливование на низком уровне дискредитирует всю 20-летнюю теорию сложности алгоритмов

                С учётом того, что сложность алгоритмов обычно оперирует ассимптотикой количества требуемых операций (или ячеек памяти), то этот тезис выглядит очень спорно. От того, что операции выполняются на разных ядрах, их кол-во ассимптотически не изменяется, так ведь?
                Ответить
                • Распараллеливание дает выигрыш только в константе, да. И то, только если задача попалась подходящая под параллельную обработку...
                  Ответить
                  • Распараллеливание даёт проигрыш в константе, т.к. кол-во операций обычно увеличивается. Иногда мы получаем результат быстрее, но ведь в анализе сложности нигде не фигурирует понятие времени, только кол-во операций.
                    По счастливому совпадению из меньшего кол-во операций в случае однопоточной программы часто следует меньшее время выполнения (и то не всегда верно, т.к. сильно влияют факторы вроде локальности данных). В многопоточной программе это работает ещё реже, но, тем не менее, это слабо влияет на классический анализ сложности.
                    Ответить
                    • Плюс распараллеливание преподносится как панацея, и все радостно начинают запихивать ее куда не поподя. Сам видел у знакомого в коде распараллеливание возведения элементов массива в квадрат. Все бы ничего, но в массиве было 10 элементов. Имхо распараллеливание полезно, особенно при огромном количестве данных (таже CUDA), но его вычислительный потенциал переоценен.
                      Ответить
                      • Будет ли таким большим оверхед? Если да - можно придумать решение, вторым параметром передается минимальное количество элементов на едро.
                        Ответить
                        • >Будет ли таким большим оверхед?
                          Медленная шина для передачи туда-сюда, и разное адресное пространство CPU и GPU замедлят такой код раз в сто.
                          Это чисто царский подход - юноши-максималиста, оценивающего сырую мощь, а не схему в целом.
                          Ответить
                          • >Медленная шина для передачи туда-сюда, и разное адресное пространство CPU и GPU замедлят такой код раз в сто.

                            Поэтому имеет смысл кинуть на GPU over 100000 действий. Опять же не панацея.
                            Ответить
                          • Я не про куду и гпгпу, а про assParallol.
                            Ответить
                    • Плюсую Романа по треду - он очень дельно говорит.

                      Будь у вас хоть миллионы ядер - не разложите вы, на существующей алгоритмической базе, огромное простое число на множители и не поломаете открытую криптографию.

                      И то что оставалось от гипотезы Гольдбаха не докажете экспериментально - тупым перебором до числа Виноградова. Хотя казалось бы сейчас компьютеры жутко скоростные, не то что 1937 год.
                      А всё потому что для полного перебора энергии понадобилось бы больше чем есть в Солнечной системе.
                      Кстати всех поздравляю - наконец-то, совсем недавно тернарную доказал другой выходец со славянской земли; теперь уже окончательно и бесповоротно.
                      Ответить
                      • кто, извините, кого - доказал?
                        Ответить
                        • > кто, извините, кого - доказал?
                          "В 2013 году тернарная гипотеза Гольдбаха была окончательно доказана Харальдом Гельфготтом" wiki
                          Ответить
                      • Что он дельно сказал то?

                        >Будь у вас хоть миллионы ядер - не разложите вы, на существующей алгоритмической базе, огромное простое число на множители и не поломаете открытую криптографию.
                        Класс сложности известен + простая арифметика? Или это твой коллега по шараге тоже изобрел?
                        Ответить
                        • >Что он дельно сказал то?
                          Ядра - количественное улучшение, максимум на порядок.
                          Алгоритмы - качественное, они позволят решать задачи, на брутфорс для которых ранее потребовалось бы невообразимое количество энергии (то есть нерешаемые в принципе).

                          Экстенсивное vs Интенсивное. Так понятно?
                          Ответить
                • Ну да, в количестве операций. А скорость тоже, наверное, в километрах меряется, да?
                  Но теоретической базы посчитать пока что не очень. Вся имеющаяся теория более-менее сводится к CSP (Communicating Sequential Processes), но там еще далеко до моделей производительности.
                  Но как в последнее время все образованное сообщество метнулось производительность считать не в тиках, а в копировании данных (communication avoiding), то это создает совсем другую картину мира, в которой большая О вместе с фитой становятся менее актуальными.
                  Ответить
                  • > А скорость тоже, наверное, в километрах меряется, да?
                    Это к чему? Сложность "предсказывает" кол-во операций по отношению к размерности задачи, скорость - пройденное расстояние по отношению к прошедшему времени.
                    Ответить
                    • А какой практический смысл мерять сложность, если не для того, чтобы узнать скорость? Сама по себе такая сложность - просто бесполезный факт.
                      Ответить
                      • при известной сложности оценить скорость можно либо четко зная, на чем поедешь (абсолютное значение), либо всего лишь сравнив с другой скоростью (относительное значение)
                        в книжках никто не знает на чем ты поедешь, а понять относительные величины легко можно и сравнив сложности, не прибегая к скорости - от москвы до питера 700км, а до продуктового магазина - 100м
                        софистика
                        Ответить
                        • Ммм... нет, тут ситуация другая. Имеет место быть попытка редукционизма / деконструктивизма, нарушающего гешталт.
                          Т.е. если сравнивать со скоростью, имеем что из нескольких точек А, Б, В... вышло сколько-то поездов и все вместе проехали 386 километров. Такая деконструкция бессмысленна, и мерять общее пройденное расстояние не зная как минимум сколько поездов всего было - просто бессмысленное занятие.
                          Ответить
              • Закон Амдала кредитирует все обратно.
                Ответить
    • Python 2.7.4 (default, Sep 26 2013, 03:20:56)
      [GCC 4.7.3] on linux2
      Type "help", "copyright", "credits" or "license" for more information.
      >>> 2/3
      0
      >>> 2/3.
      0.6666666666666666
      >>> from __future__ import division
      >>> 2/3
      0.6666666666666666
      >>> 2//3
      0
      Ответить
      • Ну да. Это я знаю. В третьем питоне все правильно сделали. Во втором - нет.
        Ответить
        • Во втором питоне сделали, как тогда везде было - жавка, си.
          Ответить
          • Ну вот только не надо сюда приплетать жавку и си. В жабе и си тип переменной известен во время компиляции. В питоне - только в рантайме. Поэтому какая-нибудь хрень в духе:
            some = json.loads(some_json)
            y = some['x'] / 2
            при {"x":3.0} и {"x":3} будет работать по-разному. В третьем питоне же все сделали правильно - один оператор всегда возвращает флоаты, а второй всегда возвращает целые.

            P.S. Хотя с // они опять накосячили - если один из аргументов флоат, то он какого-то хуя возвращает float, хотя подразумевается целый результат. 2.0 // 3 = 0.0, хотя должно возвращать просто 0, ну или на крайний случай исключение.
            Ответить
            • Борманд, я не понимаю твой багет. Поведение давно известно и проблем не вызывает. Где горит-то? Что портируется плохо? Так это не единственное и далеко не главное место.
              Ответить
              • > Где горит-то?
                У меня горит, потому что я на это нарвался, когда выкладывал этот гк :) Впрочем виноват тут скорее я сам, т.к. понадеялся на интуитивное поведение (/ всегда возвращает флоат, аля паскаль), и доку по делению прочитал только после того, как наткнулся на эту говнофичу деления.
                Ответить
                • >понадеялся на интуитивное поведение (/ всегда возвращает флоат, аля паскаль),
                  Почему это поведение для тебя интуитивное? В сишкообразных языках это всегда было как в си.
                  Ответить
                  • > Почему это поведение для тебя интуитивное?
                    Ну как минимум жабаскрипт себя так ведет. И легче предсказать результат.

                    > В сишкообразных языках это всегда было как в си.
                    Еще раз. Не надо сюда приплетать сишкообразные языки. У них, практически у всех, типы разруливаются во время компиляции (в жс нет - но в нем / всегда флоат). И там я всегда знаю заранее, когда / это целочисленное деление, а когда нет.
                    Ответить
                  • Ты лучше расскажи, почему ты так оправдываешь питон 2 за это поведение. И почему ты считаешь его более логичным, чем поведение третьего.
                    Ответить
                    • Я не оправдываю, я не вижу повода для батхерта. Ну сделали так. Питон 1-2 очень старый. Это далеко не самое страшное г, которое в нем есть.
                      Ответить

    Добавить комментарий