Как использовать Cython для ускорения кода для Codejam - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь справиться с задачами Codejam, мой основной язык программирования - Python, и поэтому я также решаю все проблемы, с которыми сталкиваюсь, используя Python. Однако я начал нажимать TLE с кодом, который кажется нормальным и соответствует решению, описанному в анализе. Поэтому я изучаю возможность использования Cython, чтобы ускорить мой код. Я могу использовать это на своем локальном компьютере, я более или менее понимаю основы того, как это работает. Из того, что я собрал на inte rnet, похоже, что google code jam позволяет использовать Cython, но я не знаю, как его использовать.

В качестве примера я недавно попробовал решение New Elements : Part 1 из Google Code Jam 2019: Раунд 2 (см. ниже). Какие практические шаги я должен предпринять, чтобы сделать это решение более быстрым, используя Cython? Я НЕ прошу каких-либо предложений относительно того, как улучшить этот код, просто как использовать Cython в среде codejam.

T=int(input())

for t in range(1, T+1):
    N=int(input())
    CJ_list=list()
    possible=True
    for n in range(N):
        C, J = map(int, input().split())
        CJ_list.append((C, J))
    ls_crossings=list()
    for n1, CJ1 in enumerate(CJ_list):
        if not possible:
            break
        for n2, CJ2 in enumerate(CJ_list):
            if n1<=n2:
                continue
            if CJ1==CJ2:
                possible=False
                break
            if CJ1[0] == CJ2[0] or CJ1[1] == CJ2[1]:
                continue
            teller=(CJ2[1]-CJ1[1])
            noemer=(CJ1[0] - CJ2[0])
            if (teller * noemer < 0):
                continue
            is_duplicate=False
            for crossing in ls_crossings:
                if crossing[0]*noemer==crossing[1]*teller:
                    is_duplicate=True
                    break
            if not is_duplicate:
                ls_crossings.append((teller, noemer))

    if possible:
        print("Case #{}: {}".format(t, len(ls_crossings)+1))
    else:
        print("Case #{}: {}".format(t, 0))
...