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

    −106

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    def accordance_score( required, estimated ):
    	q = 0.5
    	scan_length = max( len(required), len(estimated) )
    	result = 0.0
    
    	i = 0
    	j = 0
    	while (i < len(estimated)) and (j < len(required)):
    		if estimated[i].upper() == required[j].upper():
    			result += q ** x
    			j += 1
    
    		i += 1
    
    	return result / ( (q ** scan_length - 1) / (q - 1) )

    Не могу доказать человеку, что код - говно. Помогите.

    Запостил: Fai, 30 Октября 2012

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

    • Переменная x не инициализирована.
      Ответить
      • Похоже, она глобальная.
        Код, конечно, не айс: смысл туманен, простор для оптимизации велик, но не так чтобы уж полное Г
        Ответить
      • Интереснее, что в рамках вызова ф-ии q**x - константа, можно было бы домножить в конце. И scan_len зачем-то вводится сразу, а используется единожды, лучше бы поместить перед return.
        Ответить
    • Лучший способ доказать, что код говно, показать человеку правильный вариант кода по твоему мнению.
      Возможно автор поста так делал, и человек просто не согласен с тем что его код говно по сравнению с приведенным автором поста.
      Ответить
    • Если required и estimated - строки, то, на сколько я понимаю, тут намечается квадратное время, вместо линейного (т.как за кулисами используется strlen). И есть подозрение, что автор кода хотел найти все вхождения одной строки или символа в другой строке или списке. Но без объяснительной не понять.
      Вот отсутствие комментариев - в таком случае, да, наверное говнокод.
      Ответить
      • > тут намечается квадратное время, вместо линейного
        len() - операция O(1)

        > что автор кода хотел найти все вхождения одной строки или символа в другой строке или списке
        автор кода вычисляет меру "похожести" строк, что отражено в названии функции
        Ответить
        • len() - это API высокого уровня, и может делать что угодно в зависимости от того, к чему применяется. Может быть хоть NP-hard, если так кому-то захотелось. На сколько я знаю (но могу ошибаться), строки в Питоне такие же, как и в Си, и для строк len() превращается в strlen, и соответственно, становится O(n).

          У слова accordance есть такое множество значений... я про такое использование и не слышал никогда. А если бы нужно было похожесть строк искать, использовал бы Левиншейна.
          Ответить
          • Питоньи строки ближе к жабовским, они иммутабельны. Поэтому реализовывать len() для них через strlen() - глупо. Бенчмарки это подтверждают.
            http://ideone.com/KGdXp2
            Ответить
            • Хз, когда-то давно искал что-то grep'ом по исходникам Питона и наткнулся на strlen. Может быть версия была другой может быть это не для строк использовалось - я не разбирался, поэтому и говорю, что не уверен.
              И все равно это не отменяет того, что у len() нету какой-то одной сложности. Она определяется конкретным типом объекта к которому применяется.
              Ответить
              • > И все равно это не отменяет того, что у len() нету какой-то одной сложности. Она определяется конкретным типом объекта к которому применяется.

                len - операция расширяемая, можно определить у любого объекта метод __len__ и делить в нём на ноль или осуществлять доступ к базе данных. У всех же встроенных питоньих контейнеров len() отрабатывает за O(1).
                Ответить
        • А можно какую-нибудь ссылку на этот алгоритм? Гугл и Википедия не нашли ничего похожего. Accordance в контексте алгоритмов встречается только как in accordance to [author / statement / normative document].
          Ответить
          • Подозреваю, что алгоритм - изобретение автора. Я не утверждаю, что он хорош (я бы взял расстояние по Левенштейну), но, с моей точки зрения, автор хотел именно найти меру "похожести" строк. Accordance он наверняка вычитал в translate.google.com
            Ответить
            • По этому поводу даже есть статья на хабре habrahabr.ru/post/114997.

              Видно, что алгоритмов полно, а автор начинает свой кривой велосипед пилить.
              Ответить
              • Хз... статья не интересная :/ на школьный реферат похожа. Зачем автор ее написал - не понятно. Самое ценное, что в ней было, это список ссылок в конце.
                Ответить
                • > на школьный реферат похожа
                  "Подскажите статью на хабре, которая на реферат похожа." ≡ "Подскажите фильм, в котором Джонни Депп в шляпе".
                  Ответить
                  • Подскажите статью на хабре, которую непонятно зачем писал автор.
                    Ответить
          • http://www.springer.com/mathematics/geometry/book/978-3-642-30957-1
            глава 3
            Ответить
      • >> Вот отсутствие комментариев - в таком случае, да, наверное говнокод.

        Если код нельзя понять без комментариев - это уже говнокод.
        Ответить
    • > += 1
      впервые вижу человека, который не слышал про сишкоинкремент
      Ответить
      • > впервые вижу человека, который не слышал про сишкоинкремент
        Тонко. Но питон тоже не слышал.
        Ответить
      • А я часто так пишу, и не только в питоне. Причём в питоне это statement, а не expression.
        Ответить
        • Это кстати киллер-фича. Никаких тебе x += x += x и if (x = 0)
          Ответить
      • Он брезгует.
        Стараниями некоторых граждан два креста в последнее время стали ассоциироваться с зашкваром.
        Ответить
    • Человек пишет си на питоне. На кол.
      Ответить
    • - Ну да, бомжовский вариант. Ты посмотри на себя!
      Ответить

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