Monday, June 20, 2011

Speeding up Python (NumPy, Cython, and Weave)

The high-level nature of Python makes it very easy to program, read, and reason about code. Many programmers report being more productive in Python. For example, Robert Kern once told me that "Python gets out of my way" when I asked him why he likes Python. Others express it as "Python fits your brain." My experience resonates with both of these comments.

It is not rare, however, to need to do many calculations over a lot of data. No matter how fast computers get, there will always be cases where you still need the code to be as fast as you can get it. In those cases, I first reach for NumPy which provides high-level expressions of fast low-level calculations over large arrays. With NumPy's rich slicing and broadcasting capabilities, as well as its full suite of vectorized calculation routines, I can quite often do the number crunching I am trying to do with very little effort.

Even with NumPy's fast vectorized calculations, however, there are still times when either the vectorization is too complex, or it uses too much memory. It is also sometimes just easier to express the calculation with a simple loop. For those parts of the application, there are two general approaches that work really well to get you back to compiled speeds: weave or Cython.

Weave is a sub-package of SciPy and allows you to inline arbitrary C or C++ code into an extension module that is dynamically loaded into Python and executed in-line with the rest of your Python code. The code is compiled and linked at run-time the very first time the code is executed. The compiled code is then cached on-disk and made available for immediate later use if it is called again.

Cython is an extension-module generator for Python that allows you to write Python-looking code (Python syntax with type declarations) that is then pre-compiled to an extension module for later dynamic linking into the Python run-time. Cython translates Python-looking code into "not-for-human-eyes" C-code that compiles to reasonably fast C-code. Cython has been gaining a lot of momentum in recent years as people who have never learned C, can use Cython to get C-speeds exactly where they want them starting from working Python code. Even though I feel quite comfortable in C, my appreciation for Cython has been growing over the past few years, and I know am an avid supporter of the Cython community and like to help it whenever I can.

Recently I re-did the same example that Prabhu Ramachandran first created several years ago which is reported here. This example solves Laplace's equation over a 2-d rectangular grid using a simple iterative method. The code finds a two-dimensional function, u, where ∇2 u = 0, given some fixed boundary conditions.

Pure Python Solution


The pure Python solution is the following:

from numpy import zeros
from scipy import weave

dx = 0.1
dy = 0.1
dx2 = dx*dx
dy2 = dy*dy

def py_update(u):
    nx, ny = u.shape
    for i in xrange(1,nx-1):
        for j in xrange(1, ny-1):
            u[i,j] = ((u[i+1, j] + u[i-1, j]) * dy2 +
                      (u[i, j+1] + u[i, j-1]) * dx2) / (2*(dx2+dy2))

def calc(N, Niter=100, func=py_update, args=()):
    u = zeros([N, N])
    u[0] = 1
    for i in range(Niter):
        func(u,*args)
    return u

This code takes a very long time to run in order to converge to the correct solution. For a 100x100 grid, visually-indistinguishable convergence occurs after about 8000 iterations. The pure Python solution took an estimated 560 seconds (9 minutes) to finish (using IPython's %timeit magic command).

NumPy Solution


Using NumPy, we can speed this code up significantly by using slicing and vectorized (automatic looping) calculations that replace the explicit loops in the Python-only solution. The NumPy update code is:

def num_update(u):
    u[1:-1,1:-1] = ((u[2:,1:-1]+u[:-2,1:-1])*dy2 + 
                    (u[1:-1,2:] + u[1:-1,:-2])*dx2) / (2*(dx2+dy2))

Using num_update as the calculation function reduced the time for 8000 iterations on a 100x100 grid to only 2.24 seconds (a 250x speed-up).   Such speed-ups are not uncommon when using NumPy to replace Python loops where the inner loop is doing simple math on basic data-types.

Quite often it is sufficient to stop there and move on to another part of the code-base.  Even though you might be able to speed up this section of code more, it may not be the critical path anymore in your over-all problem.  Programmer effort should be spent where more benefit will be obtained.  Occasionally, however, it is essential to speed-up even this kind of code.

Even though NumPy implements the calculations at compiled speeds, it is possible to get even faster code.   This is mostly because NumPy needs to create temporary arrays to hold intermediate simple calculations in expressions like the average of adjacent cells shown above.  If you were to implement such a calculation in C/C++ or Fortran, you would likely create a single loop with no intermediate temporary memory allocations and perform a more complex computation at each iteration of the loop.

In order to get an optimized version of the update function, we need a machine-code implementation  that Python can call.   Of course, we could do this manually by writing the inner call in a compilable language and using Python's extension facilities.  More simply, we can use Cython and Weave which do most of the heavy lifting for us.

Cython solution


Cython is an extension-module writing language that looks a lot like Python except for optional type declarations for variables.  These type declarations allow the Cython compiler to replace generic, highly dynamic Python code with specific and very fast compiled code that is then able to be loaded into the Python run-time dynamically.  Here is the Cython code for the update function:

cimport numpy as np

def cy_update(np.ndarray[double, ndim=2] u, double dx2, double dy2):
    cdef unsigned int i, j
    for i in xrange(1,u.shape[0]-1):
        for j in xrange(1, u.shape[1]-1):
            u[i,j] = ((u[i+1, j] + u[i-1, j]) * dy2 +
                      (u[i, j+1] + u[i, j-1]) * dx2) / (2*(dx2+dy2))

This code looks very similar to the original Python-only implementation except for the additional type-declarations.   Notice that even NumPy arrays can be declared with Cython and Cython will correctly translate Python element selection into fast memory-access macros in the generated C code.   When this function was used for each iteration in the inner calculation loop,  the 8000 iterations on a 100x100 grid took only 1.28 seconds.

For completeness, the following shows the contents of the setup.py file that was also created in order to produce a compiled-module where the cy_update function lived.

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

import numpy

ext = Extension("laplace", ["laplace.pyx"],
    include_dirs = [numpy.get_include()])
                
setup(ext_modules=[ext],
      cmdclass = {'build_ext': build_ext})

The extension module was then built using the command: python setup.py build_ext --inplace

Weave solution


An older, but still useful, approach to speeding up code is to use weave to directly embed a C or C++ implementation of the algorithm into the Python program directly.   Weave is a module that surrounds the bit of C or C++ code that you write with a template to on-the-fly create an extension module that is compiled and then dynamically loaded into the Python run-time.   Weave has a caching mechanism so that different strings or different types of inputs lead to a new extension module being created, compiled, and loaded.    The first time code using weave runs, the compilation has to take place.  Subsequent runs of the same code will load the cached extension module and run the machine code.

For this particular case, an update routine using weave looks like:

def weave_update(u):
    code = """
    int i, j;
    for (i=1; i<Nu[0]-1; i++) {
       for (j=1; j<Nu[1]-1; j++) {
           U2(i,j) = ((U2(i+1, j) + U2(i-1, j))*dy2 + \
                       (U2(i, j+1) + U2(i, j-1))*dx2) / (2*(dx2+dy2));
       }
    }
    """
    weave.inline(code, ['u', 'dx2', 'dy2'])

The inline function takes a string of C or C++ code plus a list of variable names that will be pushed from the Python namespace into the compiled code.   The inline function takes this code and the list of variables and either loads and executes a function in a previously-created extension module (if the string and types of the variables have been previously created) or else creates a new extension module before compiling, loading, and executing the code.

Notice that weave defines special macros so that U2 allows referencing the elements of the 2-d array u using simple expressions.   Weave also defines the special C-array of integers Nu to contain the shape of the u array.   There are also special macros similarly defined to access the elements of array u if it would have been a 1-, 3-, or 4-dimensional array (U1, U3, and U4).   Although not used in this snippet of code, the C-array Su containing the strides in each dimension and the integer Du defining the number of dimensions of the array are both also defined.

Using the weave_update function, 8000 iterations on a 100x100 grid took only 1.02 seconds.   This was the fastest implementation of all of the methods used.    Knowing a little C and having a compiler on hand can certainly speed up critical sections of code in a big way.

Faster Cython solution (Update)


After I originally published this post, I received some great feedback in the Comments section that encouraged me to add some parameters to the Cython solution in order to get an even faster solution. I was also reminded about pyximport and given example code to make it work more easily. Basically by adding some compiler directives to Cython to avoid some checks at each iteration of the loop, Cython generated even faster C-code. To the top of my previous Cython code, I added a few lines:

#cython: boundscheck=False
#cython: wraparound=False

I then saved this new file as _laplace.pyx, and added the following lines to the top of the Python file that was running the examples:

import pyximport
import numpy as np
pyximport.install(setup_args={'include_dirs':[np.get_include()]})
from _laplace import cy_update as cy_update2


This provided an update function cy_update2 that resulted in the very fastest implementation (943 ms) for 8000 iterations of a 100x100 grid.

Summary


The following table summarizes the results which were all obtained on a 2.66 Ghz Intel Core i7 MacBook Pro with 8GB of 1067 Mhz DDR3 Memory. The relative speed column shows the speed relative to the NumPy implementation.

Method Time (sec) Relative Speed
Pure Python 560 250
NumPy 2.24 1
Cython 1.28 0.57
Weave 1.02 0.45
Faster Cython 0.94 0.42

Clearly when it comes to doing a lot of heavy number crunching, Pure Python is not really an option. However, perhaps somewhat surprisingly, NumPy can get you most of the way to compiled speeds through vectorization. In situations where you still need the last ounce of speed in a critical section, or when it either requires a PhD in NumPy-ology to vectorize the solution or it results in too much memory overhead, you can reach for Cython or Weave. If you already know C/C++, then weave is a simple and speedy solution. If, however, you are not already familiar with C then you may find Cython to be exactly what you are looking for to get the speed you need out of Python.

147 comments:

  1. Just out of curiosity, have you tried to disable bounds checking and wrap around for cython?

    cimport cython
    @cython.boundscheck(False)
    @cython.wraparound(False)
    def cy_update(...): ...

    see:
    http://wiki.cython.org/enhancements/compilerdirectives

    ReplyDelete
  2. Thanks for the writeup.
    There's also a numexpr project ( http://code.google.com/p/numexpr/ ) which claims to speed up numpy operations.
    It'll be good if you can add it to the mix to see how far we can go with only pure python user code

    ReplyDelete
  3. pyximport provides a quick alternative to setup.py. For example, I put the cy_update function in _laplace.pyx. Then I imported it at as follows:

    import pyximport
    pyximport.install(setup_args={'include_dirs': [np.get_include()]})
    from _laplace import cy_update

    The default destination for the builds is the directory .pyxbld in your home directory.

    ReplyDelete
  4. pankaj,

    Thanks for the suggestion about numexpr. I definitely thought about numexpr and actually did do a numexpr example --- but in this case I did not get any speed up. In fact, it was slower than the NumPy example (took 4 seconds). Now, I didn't try to investigate if any configurations to the numexpr engine would speed that up. If you have any suggestions that would be very helpful.

    ReplyDelete
  5. Pankaj,

    Here is my num expr example that didn't work so well:

    def expr_update(u):
        bottom = u[2:,1:-1]
        top = u[:-2,1:-1]
        left = u[1:-1,2:]
        right = u[1:-1,:-2]
        u[1:-1,1:-1] = ne.evaluate("((bottom + top)*dy2 + "\
            "(left + right)*dx2) / (2*(dx2+dy2))")

    ReplyDelete
  6. Hsy,

    Thanks for reminding me about the compiler directives. I should have remembered that one. I added

    #cython: boundscheck=False
    #cython: wraparound=False

    to the top of my file and ended up with a 943 ms solution for Cython. I will add that to the table.

    ReplyDelete
  7. Eryksun,

    Thank you for the suggestion about pyximport. I had heard of it, but had not used it much. That is indeed a bit easier to explain.

    ReplyDelete
  8. I updated the post to reflect the suggestions of Eryksun and Hsy. Thanks for the feedback!

    ReplyDelete
  9. Hi Travis! Can you please run my Fortran 90 implementation on your computer?

    https://github.com/certik/laplace_test

    Here is my table using Aspire 1830T, Intel Core i7:

    Method Time Relative Speed

    NumPy 2.03 1
    Cython 1.25 0.61
    Fortran loop 0.47 0.23
    Fortran array 0.19 0.09

    Using gfortran 4.5.2 in Ubuntu Natty and the following optimizations:
    -O3 -march=native -ffast-math -funroll-loops

    So my Fortran array implementation is 6.5x faster than your slower Cython implementation.

    ReplyDelete
  10. The reason I am asking is that my Fortran reimplementation of the *same* NumPy solution (i.e. using arrays instead of loops) is 10.6 faster. As such (if my benchmark is correct), your conclusion that NumPy can get you "most" of the way to compiled speed would be questionable, because it would be better to simply use Fortran, using the NumPy like programming, to get 10x speedup, with minimal effort.

    But maybe there is some hidden problem somewhere (i.e. some compiler options, lapack (?), who knows).

    ReplyDelete
  11. I've just finished a 4 hour tutorial at EuroPython 2011 on High Performance Python, the slides are online:
    http://ep2011.europython.eu/conference/talks/experiences-making-cpu-bound-tasks-run-much-faster
    I covered Python, PyPy, Cython, Numpy (+cython), NumExpr, ShedSkin, multiprocessing, ParallelPython and pyCUDA for the Mandelbrot problem.
    I'm in the process of writing up the training into a free ebook, it'll be on my blog (http://ianozsvald.com/) all going well within a week.
    Ian.

    ReplyDelete
  12. Hi Travis! I'd like to point out that PyPy is very promising in terms of massively speeding up native Python and considerably speeding up Numpy.

    I ran your example with the native Python and Numpy update methods, and got the behavior you observe: the speedup is at least two orders of magnitude. Then I wrote a tiny wrapper class around Python lists to emulate 2D arrays, and ran it through PyPy 1.5. At 8000 iterations, it's roughly 2x slower than CPython+Numpy. That is an astounding improvement over native Python!

    There is an effort underway to port Numpy to PyPy, but it seems not enough communication is happening between PyPy and Numpy developers. I need Numpy for my job, and I would love to see Numpy incorporate support for PyPy! (I intend to help as well.) I think PyPy has made spectacular progress recently and is the future of Python.

    ReplyDelete
  13. Forgot to mention - please see these blog posts for PyPy developers' efforts with Numpy:

    http://morepypy.blogspot.com/2011/05/numpy-in-pypy-status-and-roadmap.html
    http://morepypy.blogspot.com/2011/05/numpy-follow-up.html

    ReplyDelete
  14. Thanks for reviving performance Python again. :)

    I wonder how well np_inline works. Given the trouble with weave from time to time, it seems like a simple alternative. I haven't used it but saw it on the scipy mailing lists:

    http://pages.cs.wisc.edu/~johnl/np_inline/

    I'm also curious about Ondrej's benchmarks. In the past, with the original Performance Python article the speed difference with the modified weave/pyrex/fortran was not too much.

    The PyPy benchmarks are also very exciting.

    I think there is merit in actually spinning this off as a small project in itself where folks can contribute code and add to the list of benchmarks. Some form of a shootout. We could simply open up a small project on github for this? What do you think?


    cheers,
    Prabhu

    ReplyDelete
  15. I have created a new Github project called scipy/speed located here: https://github.com/scipy/speed

    There, I included a "modular" version of Ondrej's F90 example (compile with f2py). The standard looping construct gave similar results to Cython (0.93s).

    However, the "vectorized" F90 code gave the very fastest results, completing the 8000 iterations in 0.57s. This is indeed impressive. It looks like modern Fortran 90 is still the fastest way to compile vectorized expressions.

    ReplyDelete
  16. Great article and interesting about Pypy as I haven't followed it much bit might. Also, how do you get your code to show up highlighted correctly above??

    Cheers

    ReplyDelete
  17. Travis thx for this wonderful article ! I was just looking for ways to use Cython and Numpy together

    btw William Stein has a Sage worksheet that shows some of the more advanced Cython features with Numpy:

    http://flask.sagenb.org/home/pub/35/

    So what licence is the code under? Can I use parts of it in a non-commercial tutorial?

    ReplyDelete
  18. @Staffan: your link comes up with a "Notebook Bug". Could you please post a working one again?

    ReplyDelete
  19. Nice post, my response is pretty late in but may help people. You have a bug in most of your implementations, except the numpy solution.
    The numpy solution does something different than the rest, you can't actually do this update in place and get what you expect as is each iteration through the loop overwrites data that the next iterations expects to be there, that is, this iteration which updates U2(i,j) actually ruins the input for the next iteration's U2(i,j-1)

    ReplyDelete
    Replies
    1. Micha, It's been a (very) long time since I did this kind of stuff and my memory is dim on the details. (And Varga's book on "Matrix Iterative Analysis" is sitting on my bookshelf at the office.)
      That being said, isn't the numpy version akin to a Jacobi over-relaxation (JOR) pass, while the other solutions are akin to a simultaneous over-relaxation (SOR) pass?
      IFF that is the case (and my memory isn't failing me), then in fact the SOR passes *should* converge faster from a numerical analysis point of view, due to their asymptotic performance.
      It's true that means the numpy and other implementations are (in effect) using different algorithms, with the numpy being the slower performer.
      In other words, it may not be a bug, it may be a feature!
      Warning! People who are obsessed about this kind of stuff should definitely look it up in (somplace like) Varga's book, rather than trusting my imperfect memory.

      Delete
    2. I noticed the same thing -- the NumPy version does Jacobi while the others do Gauss-Seidel. You could do red-black Gauss-Seidel in the pure NumPy version, but I don't think that it is possible to do pure Gauss-Seidel with NumPy. Also, if you look at the results, you'll see that the NumPy version converges slower.

      The timings are likely still fine, since the # of operations are the same, but the convergence will be worse for the NumPy version.

      I've been playing with this with the python C-API, ctypes, and f2py examples as well and f2py is the fastest.

      Delete
  20. Thanks for your article. I'm curious to know what do you guys think of the Julia language. I've slightly modified an iterative laplace implementation from here:

    https://github.com/JuliaLang/julia/blob/master/test/perf/kernel/laplace.jl

    The code is very similar to your first Python example, very easy, yet very fast!

    http://nbviewer.ipython.org/gist/Ismael-VC/6d8fd733904e169f8560

    About 0.002367143 seconds (160096 bytes allocated), using a Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz, tested at:

    https://juliabox.org

    (google account needed)

    ReplyDelete
  21. Pretty article! I found some useful information in your blog, it was awesome to read, thanks for sharing this great content to my vision, keep sharing.
    Regards,
    Salesforce institutes in Chennai|Salesforce training center in Chennai

    ReplyDelete

  22. This information is impressive; I am inspired with your post writing style & how continuously you describe this topic. After reading your post, thanks for taking the time to discuss this, I feel happy about it and I love learning more about this topic.
    Regards,
    PHP Course Chennai|php training in velachery|php training institute

    ReplyDelete
  23. Thanks for splitting your comprehension with us. It’s really useful to me & I hope it helps the people who in need of this vital information.
    Regards,
    Web designing course in chennai|Web design training in chennai|Web design course in Chennai

    ReplyDelete
  24. Thanks for sharing this niche useful informative post to our knowledge, Actually SAP is ERP software that can be used in many companies for their day to day business activities it has great scope in future so do your SAP training in chennai
    Regards,
    SAP Training Institute in Chennai|sap course in Chennai|SAP HANA Training in Chennai

    ReplyDelete

  25. Thanks for sharing this valuable post to my knowledge; SAS has great scope in IT industry. It’s an application suite that can change, manage & retrieve data from the variety of origin & perform statistical analytic on it
    Regards,
    sas training in Chennai|sas training institute in Chennai|sas training chennai

    ReplyDelete
  26. It’s too informative blog and I am getting conglomerations of info’s. Thanks for sharing; I would like to see your updates regularly so keep blogging. If anyone looking ccna just get here.
    Regards,
    ccna training institute in Chennai|ccna courses in Chennai|ccna institutes in Chennai

    ReplyDelete

  27. This technical post helps me to improve my skills set, thanks for this wonder article I expect your upcoming blog, so keep sharing..
    Regards,
    Best Informatica Training In Chennai|Informatica training center in Chennai

    ReplyDelete
  28. Cloud is one of the tremendous technology that any company in this world would rely on(Salesforce Training in Chennai). Using this technology many tough tasks can be accomplished easily in no time. Your content are also explaining the same(Salesforce admin training in chennai). Thanks for sharing this in here. You are running a great blog, keep up this good work(big data training).

    ReplyDelete
  29. Informatica Training in chennai
    This information is impressive; I am inspired with your post writing style & how continuously you describe this topic. After reading your post,
    thanks for taking the time to discuss this, I feel happy about it and I love learning more about this topic.

    ReplyDelete
  30. Pega Training in Chennai
    Brilliant article. The information I have been searching precisely. It helped me a lot, thanks.Keep coming with more such informative article. Would love to follow them..

    ReplyDelete
  31. There are lots of information about latest technology and how to get trained in them, like Hadoop Training in Chennai have spread around the web, but this is a unique one according to me. The strategy you
    have updated here will make me to get trained in future technologies Hadoop Training in Chennai By the way you are running a great blog. Thanks for sharing this..

    ReplyDelete
  32. I found some useful information in your blog, it was awesome to read, thanks for sharing this great content to my vision, keep sharing..

    Greens Technologies In Chennai

    ReplyDelete
  33. I was looking about the Oracle Training in Chennai for something like this ,Thank you for posting the great content..I found it quiet interesting, hopefully you will keep posting such blogs…

    Greens Technologies In Chennai

    ReplyDelete
  34. QTP is a software Testing Tool which helps in Functional and Regression testing of an application. If you are interested in QTP training, our real time working. QTP Training in Chennai,

    ReplyDelete
  35. Looking for real-time training institue.Get details now may if share this link visit Oracle Training in chennai

    ReplyDelete
  36. I updated the post to reflect the suggestions Job oriented Hadoop training in Chennai is offered by our institue is mainly focused on real time and industry oriented. We provide training from beginner’s level to advanced level techniques thought by our experts. Hadoop Training in Chennai

    ReplyDelete
  37. Thank you for this detailed article on Web designing course. I’m aspiring to do Web designing course.

    ReplyDelete

  38. Thanks for sharing this informative blog .To make it easier for you Greens Techonologies at Chennai is visualizing all the materials about (OBIEE).SO lets Start brightening your future.and using modeling tools how to prepare and build objects and metadata to be used in reports and more trained itself visit Obiee Training in chennai

    ReplyDelete
  39. Thanks for sharing this valuable post to my knowledge; SAS has great scope in IT industry. It’s an application suite that can change, manage & retrieve data from the variety of origin & perform statistical analytic on it...
    Regards,
    sas training in Chennai|sas course in Chennai|sas training chennai|sas training institute in Chennai

    ReplyDelete
  40. Nice blog...Very useful information is providing by ur blog..here is a way to find Oracle Training In Chennai

    ReplyDelete
  41. Nice Article! Mostly I have gathered knowledge from the blogger, because its provides more information over the books & here I can get more experienced skills from the professional, thanks for taking your to discussing this topic.
    Regards,
    cognos Training in Chennai|cognos tm1 Training in Chennai|cognos Certification

    ReplyDelete
  42. Latest Govt Jobs Notification 2016

    I have visited this blog first time and i got a lot of informative data from here which is quiet helpful for me indeed........................

    ReplyDelete
  43. Truely a very good article on how to handle the future technology. This content creates a new hope and inspiration within me. Thanks for sharing article like this. The way you have stated everything above is quite awesome. Keep blogging like this. Thanks :)

    Software testing training in chennai | Software testing course in chennai | Testing training in chennai

    ReplyDelete
  44. Hi Dude,
    Awesome Post!!! With unique content, I really get reading interest when I am following your article, I hope I ll help many of them who looking this pretty information.
    Regards,

    Python Training in Chennai|Python Training Institutes in Chennai|python training chennai|FITA Academy reviews

    ReplyDelete
  45. This information is impressive; I am inspired with your post writing style & how continuously you describe this topic. After reading your post, thanks for taking the time to discuss this, I feel happy about it and I love learning more about this topic.
    Regards,


    Fita Chennai reviews|Hadoop Training in Chennai|Big Data Training in Chennai

    ReplyDelete
  46. Call @ + 1-877-383-7827 ! Our Quicken tech support experts will accompany you to the answer on Quicken Support, Quicken help, support for Quicken , Quicken customer service.

    ReplyDelete
  47. Nice blog, here I had an opportunity to learn something new in my interested domain. I have an expectation about your future post so please keep updates.
    Regards,
    cloud computing training in chennai

    ReplyDelete
  48. Quicken Customer service @1844-898-4398 to troubleshoot your Quicken issues and our support team will get in touch provide Quicken tech help .More details http://www.quickenmaster.com/about-us.html

    ReplyDelete
  49. Thank you for your post. This was really an appreciating one. You did a good job. Keep on blogging like this unique information with us.
    SAS Training in Chennai| SAS Course in Chennai

    ReplyDelete
  50. Database means to maintain and organize all the files in a systematic format where the data can be easily accessible when needed.
    Oracle DBA training in chennai | Oracle training in chennai | Oracle course in Chennai

    ReplyDelete

  51. Hmm, if I knew what any of this did, I might be able to do it in Fortran 90+ Web Designing Training in Chennai | PHP Training in Chennai | PHP Training in Chennai

    ReplyDelete
  52. Get the help you need with Quicken Support! Then this is the best direct number 1877-383-7827 to the Quicken customer services team.

    ReplyDelete
  53. Intuit@(1844-546-3003) quicken Technical Support Phone Number vides online solution for all USA/CANADA clients. Make a call to finding a reliable Quicken support service provider.

    ReplyDelete
  54. The knowledge of python is very essential for the software developers. Python is a high level, general purpose, dynamic programming language that is of code readability and its synatx allows programmers to express the concept in fewer lines of code.
    python training in chennai | python training institutes in chennai

    ReplyDelete
  55. Quicken toll free number for any issue +1844-546-3003, quicken customer service, quicken customer care provide the online tech support accounting software services 24*7.

    ReplyDelete
  56. Get technical support and learn how to fix Quicken/Quickbooks problems online. 24x7 Quicken Tech Support Services @+1844-898-4398 by certified technicians.

    ReplyDelete
  57. nice posts...

    Informatica training, in the recent times has acquired a wide scope of popularity amongst the youngsters at the forefront of their career.
    Informatica online training in hyderabad

    ReplyDelete
  58. Contact @1-888-313-7359, We repair all PC LLC brands and ages of machines and do PC Repair at an Affordable Rate. contact Repair All PC Services to fix your computer problems.

    ReplyDelete
  59. Search expert computer and laptop repair services, spyware removal, computer upgrade, and software installation services. Here 'Repair All Pc LLC' Feel free to call on our tollfree number 1888-313-7359.

    ReplyDelete
  60. The high-level nature of Python makes it very easy to program, read, and reason about code.informatica online training Many programmers report being more productive in Python.

    ReplyDelete
  61. Are you in need of a Loan to pay off your debt and start a new life? You have come to the right place were you can get your loan at a very low interest rate. Interested people/company should please contact us via email for more details.jubrinunityfinancialloan@gmail.com

    ReplyDelete
  62. this blog are the proof that digital marketing is the most important skills in grouth the career so if you want For website creation, promotion and development contact here. For your digital marketing needs just have a look at Click Perfect

    ReplyDelete
  63. This comment has been removed by the author.

    ReplyDelete
  64. Thanks for sharing this informative content that guided me to know the details about the training offered in different technology.
    unix training institute

    ReplyDelete
  65. • Thank you for sharing this information and Very good looking blog.
    msbi training institute

    ReplyDelete
  66. Nice article i was really impressed by seeing this article, it was very interesting and it is very useful for me.I get a lot of great information from this blog. Thank you for your sharing this informative blog.. Python Training in Chennai

    ReplyDelete
  67. Thanks for sharing this informative content that guided me to know the details about the training offered in different technology.
    Datastage training in chennai

    ReplyDelete
  68. Get complete Apple Support on all Mac Book versions from 24/7 Apple team. We offer best customer care helpline number +1844-809-1494. Apple support is here to help you with all of your Apple products. Mac 24/7 technical customer helpline number +1844-809-1494.
    Apple Support Number : +1844-809-1494

    ReplyDelete
  69. found an interesting post..glad to visit your blog keep updating more!!

    Best Dot Net Training in Chennai

    ReplyDelete
  70. Hi,
    It is nice article about the python tanks for sharing
    johnsmith
    python developer
    http://www.catchexperts.com/python-online-training

    ReplyDelete
  71. Intuit Quickbooks Technical Support services provide online & offline tech support intuit quickbooks any accounting problem call +1-877-377-7005.

    ReplyDelete
  72. Excellent Post, I welcome your interest about to post blogs. It will help many of them to update
    Regards,
    JAVA Course in Chennai|Best JAVA Training in Chennai|JAVA Training

    ReplyDelete
  73. Thanks for sharing these niche piece of knowledge. Here, I had a solution for my inconclusive problems & it’s really helps me a lot keep updates…
    Big Data Hadoop Training in Chennai|Hadoop Course in Chennai

    ReplyDelete
  74. Great informative blog....Thanks for sharing these types of informative,...

    ReplyDelete

  75. Nowadays, most of the businesses rely on cloud based CRM tool to power their business process. They want to access the business from anywhere and anytime. In such scenarios, salesforce CRM will ensure massive advantage to the business owners. Salesforce Training | Salesforce Training in Chennai

    ReplyDelete
  76. Norton.com/setup 01444-390-866.Norton 360 is a security program that protects your computer from malicious programs such as viruses, Trojans, spyware and worms. Installation errors and problems when installing Norton 360 are caused by a number of different factors that vary depending on the computer. With some simple troubleshooting steps, you can resolve Norton 360 installation errors and get your program running on your computer. 1-800-214-7583. Norton.com/setup 01444-390-866.

    ReplyDelete
  77. Very good technical information

    ReplyDelete
  78. Thank you very good technical information

    Python Training in Chennai

    ReplyDelete
  79. Actually landing on this blog has been a technical discovery and I am looking forward to discover more discoveries and invention. I hope the writer will continually keep us updated with new information and on a regular basis. I also found important information that is related to the subject matter under discussion and it can be accessed by clicking on Amylase Activity Lab Report.

    ReplyDelete
  80. Very good technical information i like this blogs Core PHP Training in Noida.


    ReplyDelete
  81. Freelance Best Makeup & Hair Artist in Jaipur with huge experience and Specialization in Bridal and Wedding Makeup,Celebrity Makeup,Professional Makeup,Creative Makeup,Bollywood Makeup and Character Makeup in Delhi,Jaipur,Rajasthan. Natural Makeup that allows your skin to breath with a radiant glow and remains flawless throughout your special day.
    Best makeup and hairstyle in jaipur
    Fiza makeup academy in jaipur
    Best bridal makeup artist in jaipur(bollywood makeup,creative makeup,Airbrush makeup,character makeup)
    Make up and Hair kit
    Professional makeup artist course in jaipur
    Fiza Makeup and hairstyle tips
    Fiza Makeup and hair Images
    Fiza Makeup and hair tutorials
    Fiza Makeup and hair contract

    ReplyDelete
  82. A Pioneer Institute owned by industry professionals to impart vibrant, innovative and global education in the field of Hospitality to bridge the gap of 40 lakh job vacancies in the Hospitality sector. The Institute is contributing to the creation of knowledge and offer quality program to equip students with skills to face the global market concerted effort by dedicated faculties, providing best learning environment in fulfilling the ambition to become a Leading Institute in India.

    cha jaipur
    management college in jaipur
    management of hospitality administration jaipur
    cha management jaipurs
    Hotel management in jaipur
    Best hotel college in jaipur
    Best management college in jaipur
    College of Hospitality Administration, Jaipur
    Top 10 hotel management in jaipur
    Hotel managementin Rajasthan

    ReplyDelete


  83. It's interesting that many of the bloggers your tips helped to clarify a few things for me as well as giving.. very specific nice content. And tell people specific ways to live their lives.Sometimes you just have to yell at people and give them a good shake to get your point across.
    Web Design Company
    Web Development Company
    Web Development Company

    ReplyDelete
  84. Thanks for posting useful information. Your Blog helps to clarify a few term for me as well as giving. Great article and interesting about Python..

    Android Training in Delhi | Matlab Training Instiute in Delhi

    ReplyDelete
  85. Thanks for Sharing this valuable thought.
    Aptron Provides Best Java Training Institute in Gwalior, Best Asp.Net Training Institute in Gwalior, Best Php Training Course Institute in Gwalior with 100% Placement. The course materials and syllabus are prepared by trainers who have many years of experience in leading IT companies.

    ReplyDelete
  86. This comment has been removed by the author.

    ReplyDelete
  87. we are offering best Cognos TM1 online training with job support and high quality training facilities and well expert faculty . To Register you free demo please visit
    Cognos TM1 Online Training
    Cognos TM1 Online Training Bangalore

    ReplyDelete

  88. This is excellent information. It is amazing and wonderful to visit your site.Thanks for sharing this information,this is useful to me...
    Android Training in Chennai
    Ios Training in Chennai

    ReplyDelete
  89. Excellent and very cool idea and the subject at the top of magnificence and I am happy to this post..Interesting post! Thanks for writing it.What's wrong with this kind of post exactly? It follows your previous guideline for post length as well as clarity..
    Matlab Training in Chennai

    ReplyDelete
  90. This is excellent information. It is amazing and wonderful to visit your site.
    Matlab Training in Chennai

    ReplyDelete
  91. And this was nice content and definitely it will be useful for many people.
    SAP Traaining

    ReplyDelete
  92. I was looking for this thank you for sharing nice content
    python online training

    ReplyDelete
  93. Thanks for sharing fabulous information.It' s my pleasure to read it.I have also bookmarked you for checking out new posts.

    Pega Training in Chennai

    ReplyDelete
  94. Thanks Admin for sharing such a useful post, I hope it’s useful to many individuals for whose looking this precious information to developing their skill.
    Regards,
    Hadoop Training in Chennai|Big Data Training in Chennai

    ReplyDelete
  95. Wow nice and useful post.. Programming explanation are very clear and step by step so easy to understand the concepts easily..

    best hadoop training in chennai | best big data training in chennai

    ReplyDelete
  96. This is excellent information. It is amazing and wonderful to visit your site.
    Thank you so much for sharing this nice information.

    SEO Training Surat

    seo Traning in surat

    ReplyDelete
  97. Thank you for taking the time and sharing this information with us. It was indeed very helpful and insightful while being straight forward and to the point.
    Mcdonaldsgutscheine.net | Startlr.com | SaludLimpia.com

    ReplyDelete
  98. Your post explain everything in detail and it was very interesting to read. Thank you. Fiind nata syllabus in hyderabad .

    ReplyDelete
  99. Good and Interesting article... it is very useful for me.. thanks for sharing your views and ideas...

    Oracle Training in Chennai

    ReplyDelete
  100. Amazing Best python Training in bangalore provided by Certified Professionals. We are

    the Best python Training Institute in bangalore. Best python Coaching Center Bangalore. Selenium Training in Bangalore |
    Python Training in Bangalore |

    ReplyDelete
  101. http://www.tech4hub.com/how-to-download-two-whatsapp-in-one-phone/

    ReplyDelete
  102. Sas Training Institute in Noida- Webtrackker is the best SAS preparing focus in Noida with an abnormal state foundation and research center office. The most interesting thing is that hopefuls can select numerous IT instructional classes at Noida area, SAS certification at Noida is a great step for a highly rewarding career as a programmer, analyst, consultant or SAS developer. In this vision, webtrackker was developed by SAS Institute Inc. The United States is the SAS certification one of the most reliable industrial certifications.
    Sap Training Institute in Noida
    PHP Training Institute in Noida
    Hadoop Training Institute in Noida
    Oracle Training Institute in Noida
    Linux Training Institute in Noida
    Dot net Training Institute in Noida
    Salesforce training institute in noida
    Java training institute in noida

    ReplyDelete
  103. Sas Training Institute in Noida- Webtrackker is the best SAS preparing focus in Noida with an abnormal state foundation and research center office. The most interesting thing is that hopefuls can select numerous IT instructional classes at Noida area, SAS certification at Noida is a great step for a highly rewarding career as a programmer, analyst, consultant or SAS developer.

    ReplyDelete
  104. Sas Training Institute in Noida-Webtrackker is the best sas training institute in noida. If you are search training institute in noida than webtrackker is the best option for you. SAS has the advantages of a long history, common use of biostatists and a wide range of statistical procedures. Data transfer is very powerful for manipulating data, but it has some limitations.
    PHP Training Institute in Noida
    Sap Training Institute in Noida
    Hadoop Training Institute in Noida
    Oracle Training Institute in Noida
    Linux Training Institute in Noida
    Dot net Training Institute in Noida
    Salesforce training institute in noida
    Java training institute in noida

    ReplyDelete
  105. Sas Training Institute in Noida- Webtrackker is the best SAS training institute in noida. SAS has an integrated system that allows us to fire our SAS programs with a detailed review of each intermediate data set. What a concept! Without this great feature, you should find the wheel again for each condition, select variables, and sort the query data sets for the debugging goal of each step. Who can remember all these details or have time to re-type the SAS code.
    Sap Training Institute in Noida
    PHP Training Institute in Noida
    Hadoop Training Institute in Noida
    Oracle Training Institute in Noida
    Linux Training Institute in Noida
    Dot net Training Institute in Noida
    Salesforce training institute in noida
    Java training institute in noida

    ReplyDelete
  106. Very Useful information Thank you!!
    #TWB_ #Certifications are the #largest #communication #training #certifications in #India today. TWB Certifications™ that teach corporate workforces using GRAPE™ Content Authoring Framework™ have more than 20,000 certified professionals as of today, making TWB Certifications™ arguably the world’s largest technology content certifications. TWB_ Certifications | Technical documentation services

    ReplyDelete
  107. This comment has been removed by the author.

    ReplyDelete
  108. It's really nice to read this article... Thanks for sharing.....
    Android Course

    ReplyDelete
  109. What you have written in this post is exactly what I have experience when I first started my blog.I’m happy that I came across with your site this article is on point,thanks again and have a great day.Keep update more information.
    SEO Company in Chennai | SEO Services in Chennai

    ReplyDelete
  110. Nice it seems to be good post... It will get readers engagement on the article since readers engagement plays an vital role
    snapho

    ReplyDelete
  111. Your post about technology was very helpful to me. Very clear step-by- step
    instructions. I appreciate your hard work and thanks for sharing.
    Hadoop Training in Chennai

    ReplyDelete
  112. Amazing article! I was confused about SAS Training in Chennai, but now got a clear view of the definition. Appreciate your hard work!

    ReplyDelete
  113. Hi Travis,
    I am searching Python Job Support and I found your blog, It ends my search and gives me some good hints to return to my work. I really appreciate you for the posting coding pics with the article. Thanks!

    ReplyDelete
  114. the blog is abou Speeding up Python (NumPy, Cython, and Weave)#Python it is useful for students and Python Developers for more updates on python

    follow the link

    Python Online Training

    For more info on other technologies go with below links

    tableau online training hyderabad

    ServiceNow Online Training

    mulesoft Online Training


    java Online Training


    dot net Online Training

    ReplyDelete
  115. Thanks for giving valueable information about android concepts .

    IBM mainframe training institute “

    ReplyDelete
  116. Awesome Post. Thanks for sharing information.
    You want to get an instant solution on Quicken, just call on Quicken Tech Support Number +1-855-746-8414.

    ReplyDelete
  117. You posted quality content, this content is really very helpful for people's, Thanks. Visit Our link: https://www.loginholidays.in/

    ReplyDelete
  118. Really it was an awesome article...I found this as very interesting..please sharing like this information.

    Risk management consulting services
    ROI consultant minnesota
    consulting company minnesota

    ReplyDelete
  119. Very Very Interesting Blog With Spectacular Writing Skills.....Nice Blog.....Kudos To The Author.......
    Thank's@Salesforce

    ReplyDelete