(silly?) speed comparisons

Rajanikanth Jammalamadaka rajanikanth at gmail.com
Tue Jul 8 18:16:21 EDT 2008


Try using a list instead of a vector for the C++ version.

Raj

On Tue, Jul 8, 2008 at 3:06 PM, mk <mrkafk at gmail.com> wrote:
> Out of curiosity I decided to make some speed comparisons of the same
> algorithm in Python and C++. Moving slices of lists of strings around seemed
> like a good test case.
>
> Python code:
>
> def move_slice(list_arg, start, stop, dest):
>        frag = list_arg[start:stop]
>        if dest > stop:
>                idx = dest - (stop - start)
>        else:
>                idx = dest
>        del list_arg[start:stop]
>        list_arg[idx:idx] = frag
>        return list_arg
>
> b = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
>
>>>> import timeit
>>>> t = timeit.Timer("move_slice.move_slice(move_slice.b, 4, 6, 7)", "import
>>>> move_slice")
>>>> t.timeit()
> 3.879252810063849
>
> (Python 2.5, Windows)
>
> Implementing the same algorithm in C++:
>
> #include <vector>
> #include <iostream>
> #include <string>
>
> using namespace std;
>
> vector<string> move_slice(vector<string> vec, int start, int stop, int dest)
> {
>        int idx = stop - start;
>        vector<string> frag;
>
>        // copy a fragment of vector
>        for (idx = start; idx < stop; idx++)
>                frag.push_back(vec.at(idx));
>        if( dest > stop)
>                idx = dest - (stop - start);
>        else
>                idx = dest;
>        // delete the corresponding fragment of orig vector
>        vec.erase( vec.begin() + start, vec.begin() + stop);
>
>        // insert the frag in proper position
>        vec.insert( vec.begin() + idx, frag.begin(), frag.end());
>
>        return vec;
> }
>
>
> int main(int argc, char* argv)
> {
>        vector<string> slice;
>        string u = "abcdefghij";
>        int pos;
>        for (pos = 0; pos < u.length(); pos++)
>                slice.push_back(u.substr(pos,1));
>
>        int i;
>        for (i = 0; i<1000000; i++)
>                move_slice(slice, 4, 6, 7);
>
> }
>
> Now this is my first take at vectors in C++, so it's entirely possible that
>  an experienced coder would implement it in more efficient way. Still,
> vectors of strings seemed like a fair choice - after all, Python version is
> operating on similarly versatile objects.
>
> But I was still rather surprised to see that C++ version took 15% longer to
> execute!
>
> (vector, 4, 6, 7)
> $ time slice
>
>
> real    0m4.478s
> user    0m0.015s
> sys     0m0.031s
>
> Compiler: MinGW32/gcc 3.4.5, with -O2 optimization (not cygwin's gcc, which
> for some reason seems to produce sluggish code).
>
>
> When I changed moving the slice closer to the end of the list / vector,
> Python version executed even faster:
>
>>>> t = timeit.Timer("move_slice.move_slice(move_slice.b, 6, 7, 7)", "import
>>>> move_slice")
>>>> t.timeit()
> 1.609766883779912
>
> C++:
>
> (vector, 6, 7, 7)
> $ time slice.exe
>
>
> real    0m3.786s
> user    0m0.015s
> sys     0m0.015s
>
> Now C++ version took over twice the time to execute in comparison to Python
> time!
>
>
> Am I comparing apples to oranges? Should the implementations be different?
> Or does the MinGW compiler simply suck?
>
> Note: it appears that speed of Python lists falls down quickly the closer to
> the list beginning one deletes or inserts elements. C++ vectors do not seem
> to be as heavily position-dependent.
>
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>



-- 
"For him who has conquered the mind, the mind is the best of friends;
but for one who has failed to do so, his very mind will be the
greatest enemy."

Rajanikanth



More information about the Python-list mailing list