2. • Simplified Wrapper and Interface Generator
• Allow the use of C/C++ from other languages
• http://swig.org/
• Originally developed by Dave Beazly
• First released in February 1996
• Latest release 3.0.7, August 3rd, 2015
• Actively maintained, several releases a year
What is SWIG?
4. Are there any alternatives?
• Cython
• cTypes
• Cpython C API
5. Why would you ever want to call C/C++ from Python?
• Speed
• Existing C/C++ libraries
• With or without source
• Develop faster initially with Python
• Speed up parts that the profiler shows as critical
6. C++ Fibonacci
if (n < 0)
nextTerm = -1;
else if (n == 0)
nextTerm = 0;
else if (n == 1)
nextTerm = 1;
else {
firstTerm = 0;
secondTerm = 1;
for (int i = 0; i < n-1; ++i) {
nextTerm = firstTerm + secondTerm;
firstTerm = secondTerm;
secondTerm = nextTerm;
}
}
7. Python Fibonacci
def fib(n):
if (n < 0):
return -1
elif (n == 0):
return 0
elif (n == 1):
return 1
else:
a,b = 0,1
for i in range(n-1):
a,b = b,a+b
return a
8. How do they compare?
• Had to run both multiple times to get something measurable
• C++ significantly faster
• Python doesn’t overflow
9. C++ Library routine
long long fib(int n)
{
long long firstTerm = 0, secondTerm = 1, nextTerm;
if (n < 0)
return -1;
if (n == 0)
return 0;
if (n == 1)
return 1;
for (int i = 1; i < n-1; ++i) {
nextTerm = firstTerm + secondTerm;
if (nextTerm < secondTerm) // Overflow!
return -1;
firstTerm = secondTerm;
secondTerm = nextTerm;
}
return nextTerm;
}
11. Make a shared object or dll
g++ -g –c –o fibl.o fibl.cpp
g++ -g –shared –fPIC –Wl,-soname,libfib.so –o libfib.so fibl.o
12. Use this .so from C++
#include <iostream>
#include <stdlib.h>
#include "fib.h"
using namespace std;
int main(int argc, char* argv[]) {
if (argc < 2)
{
cout << "Usage: " << argv[0] << " <fibonacci number to print>" << endl;
return -1;
}
long n = strtol(argv[1], NULL, 10);
for (int i=0; i<100000; i++) {
fib(n);
}
cout << "Fibonacci Number " << n << " is " << fib(n) << endl;
return 0;
}
18. Now call the .so from Python
import sys
import fibl
x=int(sys.argv[1])
for i in range (1, 100000):
fibl.fib(x)
print("Fibonacci number", x, "is", fibl.fib(x))
19. Now how do the results compare?
C++ still faster, but it is much closer now
Python now overflows
20. What about a more complicated example?
#include <rw/sortvec.h>
#include <rw/collstr.h>
int main ()
{
RWSortedVector sv;
sv.insert(new RWCollectableString("dog"));
sv.insert(new RWCollectableString("cat"));
sv.insert(new RWCollectableString("fish"));
RWSortedVectorIterator next(sv);
RWCollectableString* item;
while( (item = (RWCollectableString*)next() ) != 0)
std::cout << *item << std::endl;
sv.clearAndDestroy();
return 0;
}