basic bytecode to machine code compiler (part 3)

Discussion in 'Python' started by Rouslan Korneychuk, Jun 21, 2011.

  1. My compiler now supports the x86-64 instruction set, in addition to x86.
    It also generates faster x86 machine code.

    Although it's designed to support 64-bit Windows, I have only tested it
    on Linux so far, and it doesn't support running with Windows' DEP yet.

    It's available at https://github.com/Rouslan/nativecompile

    Here are the new benchmark results. The 64-bit code has a better margin
    of improvement even though the Python interpreter is already faster in
    64-bit mode.


    The first test performs a quicksort on a list of 100 numbers, 5000
    times. The second calculates all the prime numbers up to 10000000. Each
    test is run three times in a row, first with the interpreter, then with
    the compiled code.

    #### SCRIPT ONE ####

    import time
    import random
    import nativecompile

    bcode = compile('''
    def quicksort(array):
    if len(array) <= 1:
    return array
    pindex = len(array)//2
    pivot = array[pindex]
    less = []
    greater = []
    for i,x in enumerate(array):
    if i != pindex:
    (less if x <= pivot else greater).append(x)
    return quicksort(less) + [pivot] + quicksort(greater)

    in_ = list(range(100))
    random.seed(346097)
    random.shuffle(in_)

    t = time.clock()
    for x in range(5000):
    out = quicksort(in_)
    t = time.clock()-t

    assert out == sorted(in_)

    print('execution time: {}'.format(round(t,10)))
    ''','<string>','exec')

    mcode = nativecompile.compile(bcode)

    print('byte code')
    for x in range(3): eval(bcode)
    print()

    print('machine code')
    for x in range(3): mcode()
    print()

    #### X86 OUTPUT ####

    byte code
    execution time: 1.76
    execution time: 1.75
    execution time: 1.77

    machine code
    execution time: 1.43
    execution time: 1.43
    execution time: 1.43

    #### X86-64 OUTPUT ####

    byte code
    execution time: 1.49
    execution time: 1.48
    execution time: 1.48

    machine code
    execution time: 1.17
    execution time: 1.17
    execution time: 1.17



    #### SCRIPT TWO ####

    import time
    import math
    import nativecompile

    bcode = compile('''
    def primes_list(upto):
    nums = [True] * (upto//2-1)

    for i in range(3,math.floor(math.sqrt(upto))+1,2):
    if nums[i//2-1]:
    for j in range(i*3,upto,i*2):
    nums[j//2-1] = False

    primes = []
    for i,n in enumerate(nums):
    if n: primes.append((i+1)*2+1)

    return primes

    t = time.clock()
    primes = primes_list(10000000)
    t = time.clock()-t

    print(primes[-1])
    print('execution time: {}'.format(round(t,10)))
    ''','<string>','exec')

    mcode = nativecompile.compile(bcode)

    print('byte code')
    for x in range(3): eval(bcode)
    print()

    print('machine code')
    for x in range(3): mcode()
    print()

    #### X86 OUTPUT ####

    byte code
    9999991
    execution time: 3.57
    9999991
    execution time: 3.34
    9999991
    execution time: 3.37

    machine code
    9999991
    execution time: 2.73
    9999991
    execution time: 2.67
    9999991
    execution time: 2.73

    #### X86-64 OUTPUT ####

    byte code
    9999991
    execution time: 3.05
    9999991
    execution time: 3.24
    9999991
    execution time: 3.17

    machine code
    9999991
    execution time: 2.15
    9999991
    execution time: 2.17
    9999991
    execution time: 2.17
     
    Rouslan Korneychuk, Jun 21, 2011
    #1
    1. Advertising

  2. Rouslan Korneychuk wrote:
    > if i != pindex:
    > (less if x <= pivot else greater).append(x)


    Just curious, is there a reason why you wrote this last line that way
    instead of using a "normal" if/else clause?


    Cheers!

    Uli


    --
    Domino Laser GmbH
    Geschäftsführer: Thorsten Föcking, Amtsgericht Hamburg HR B62 932
     
    Ulrich Eckhardt, Jun 21, 2011
    #2
    1. Advertising

  3. On 06/21/2011 06:55 AM, Ulrich Eckhardt wrote:
    > Rouslan Korneychuk wrote:
    >> if i != pindex:
    >> (less if x<= pivot else greater).append(x)

    >
    > Just curious, is there a reason why you wrote this last line that way
    > instead of using a "normal" if/else clause?
    >
    >
    > Cheers!
    >
    > Uli
    >
    >


    No special reason. I just like concise code.
     
    Rouslan Korneychuk, Jun 21, 2011
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    4
    Views:
    5,832
    Michael Borgwardt
    Dec 10, 2004
  2. Robert McLay

    Is bytecode machine (in)dependent?

    Robert McLay, Oct 28, 2005, in forum: Python
    Replies:
    1
    Views:
    398
    Tim Peters
    Oct 28, 2005
  3. gk
    Replies:
    13
    Views:
    2,326
    Dijon Yu
    Sep 22, 2006
  4. Rouslan Korneychuk

    a basic bytecode to machine code compiler

    Rouslan Korneychuk, Mar 31, 2011, in forum: Python
    Replies:
    10
    Views:
    450
    Robert Kern
    Apr 3, 2011
  5. Rouslan Korneychuk

    basic bytecode to machine code compiler (part 2)

    Rouslan Korneychuk, May 18, 2011, in forum: Python
    Replies:
    0
    Views:
    224
    Rouslan Korneychuk
    May 18, 2011
Loading...

Share This Page