<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>enthought blog</title>
	<atom:link href="http://blog.enthought.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://blog.enthought.com</link>
	<description>News and information about Enthought, Inc. and Enthought&#039;s open source software.</description>
	<lastBuildDate>Wed, 07 Jul 2010 19:17:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Fast Numpy/Protobuf deserialization example</title>
		<link>http://blog.enthought.com/?p=455</link>
		<comments>http://blog.enthought.com/?p=455#comments</comments>
		<pubDate>Wed, 07 Jul 2010 19:17:49 +0000</pubDate>
		<dc:creator>Bryce Hendrix</dc:creator>
		
		<guid isPermaLink="false">http://blog.enthought.com/?p=455</guid>
		<description><![CDATA[In my last post I wrote about how I was able to improve protobuf deserialization using a C++ extension. I&#8217;ve boiled down the code to its essence to show how I did it. Rather than zip everything up in a file, the code is short enough to show in its entirety. Here&#8217;s the simplified protobuf [...]]]></description>
			<content:encoded><![CDATA[<p>In my last post I wrote about how I was able to improve protobuf deserialization using a C++ extension. I&#8217;ve boiled down the code to its essence to show how I did it. Rather than zip everything up in a file, the code is short enough to show in its entirety.</p>
<p>Here&#8217;s the simplified protobuf message which is used to represent a time series as 2 arrays:</p>
<pre class="brush: python">
package timeseries;

message TimeSeries {
    repeated double times = 2;
    repeated double values = 3;
}
</pre>
<p>I then wrote a test app in Python and C++ to provide a benchmark. Here is the Python version:</p>
<pre class="brush: python">
import numpy
import time_series_pb2

def write_test():
    ts = time_series_pb2.TimeSeries()
    for i in range(10000000):
        ts.times.append(i)
        ts.values.append(i*10.0)

    import time
    start = time.time();

    f = open(&quot;ts.bin&quot;, &quot;wb&quot;)
    f.write(ts.SerializeToString())
    f.close()

    print time.time() - start

def read_test():
    ts = time_series_pb2.TimeSeries()

    import time
    start = time.time();

    f = open(&quot;ts.bin&quot;, &quot;rb&quot;)
    ts.ParseFromString(f.read())
    f.close()

    t = numpy.array(ts.times._values)
    v = numpy.array(ts.values._values)

    print &#039;Read time:&#039;, time.time() - start
    print &quot;Read time series of length %d&quot; % len(ts.times)

if __name__ == &quot;__main__&quot;:
    import sys
    if len(sys.argv) &lt; 2:
        print &quot;usage:   %s &lt;--read&gt; | &lt;--write&gt;&quot; % sys.argv[0]

    if sys.argv[1] == &quot;--read&quot;:
        read_test()
    else:
        write_test()
</pre>
<p>I will spare you the C++ standalone code, since it was only a stepping stone. Instead here is the C++ extension, with 2 exposed methods, one which deserializes a string and the other which operates on a file.</p>
<pre class="brush: c++">
#include &lt;fcntl.h&gt;

#include &lt;Python.h&gt;
#include &lt;numpy/arrayobject.h&gt;
#include &lt;google/protobuf/io/coded_stream.h&gt;
#include &lt;google/protobuf/io/zero_copy_stream_impl_lite.h&gt;
#include &lt;google/protobuf/io/zero_copy_stream_impl.h&gt;

#include &quot;time_series.pb.h&quot;

static PyObject* construct_numpy_arrays(timeseries::TimeSeries* ts)
{
    // returns a tuple (t,v) where t and v are double arrays of the same length

    PyObject* data_tuple = PyTuple_New(2);

    long array_size = ts-&gt;times_size();
    double* times = new double[array_size];
    double* values = new double[array_size];

    // the data must be copied because the tsid will go away and its mutable data
    // will too
    memcpy(times, ts-&gt;times().data(), ts-&gt;times_size()*sizeof(double));
    memcpy(values, ts-&gt;values().data(), ts-&gt;values_size()*sizeof(double)); 

    // put the arrays into numpy array objects
    npy_intp dims[1] = {array_size};
    PyObject* time_array = PyArray_SimpleNewFromData(1, dims, PyArray_DOUBLE, times);
    PyObject* value_array = PyArray_SimpleNewFromData(1, dims, PyArray_DOUBLE, values);

    PyTuple_SetItem(data_tuple, 0, time_array);
    PyTuple_SetItem(data_tuple, 1, value_array);

    return data_tuple;
}

static PyObject* TimeSeries_load(PyObject* self, PyObject* args)
{
    char* filename = NULL;

    if (! PyArg_ParseTuple(args, &quot;s&quot;, &amp;filename))
    {
        return NULL;
    }

    timeseries::TimeSeries ts;

    int fd = open(filename, O_RDONLY);
    google::protobuf::io::FileInputStream fs(fd);
    google::protobuf::io::CodedInputStream coded_fs(&amp;fs);
    coded_fs.SetTotalBytesLimit(500*1024*1024, -1);
    ts.ParseFromCodedStream(&amp;coded_fs);
    fs.Close();
    close(fd);

    return construct_numpy_arrays(&amp;ts);
}

static PyObject* TimeSeries_deserialize(PyObject* self, PyObject* args)
{
    int buffer_length;
    char* serialization = NULL;

    if (! PyArg_ParseTuple(args, &quot;t#&quot;, &amp;serialization, &amp;buffer_length))
    {
        return NULL;
    }
    google::protobuf::io::ArrayInputStream input(serialization, buffer_length);

    google::protobuf::io::CodedInputStream coded_fs(&amp;input);
    coded_fs.SetTotalBytesLimit(500*1024*1024, -1);

    timeseries::TimeSeries ts;
    ts.ParseFromCodedStream(&amp;coded_fs);
    return construct_numpy_arrays(&amp;ts);
}

static PyMethodDef TSMethods[] = {
    {&quot;load&quot;, TimeSeries_load, METH_VARARGS, &quot;loads a TimeSeries from a file&quot;},
    {&quot;deserialize&quot;, TimeSeries_deserialize, METH_VARARGS, &quot;loads a TimeSeries from a string&quot;}
};

#ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */
#define PyMODINIT_FUNC void
#endif
PyMODINIT_FUNC inittimeseries(void)
{
    import_array();
    (void) Py_InitModule(&quot;timeseries&quot;, TSMethods);
}
</pre>
<p>Calling the exension from python is trivial:</p>
<pre class="brush: python">
import time
import timeseries
start = time.time()
t, v = timeseries.load(&#039;ts.bin&#039;)
print &quot;read and converted to numpy array in %f&quot; % (time.time()-start)
print &quot;timeseries contained %d values&quot; % len(v)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.enthought.com/?feed=rss2&amp;p=455</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Fast Protocol Buffers in Python</title>
		<link>http://blog.enthought.com/?p=449</link>
		<comments>http://blog.enthought.com/?p=449#comments</comments>
		<pubDate>Thu, 01 Jul 2010 22:02:57 +0000</pubDate>
		<dc:creator>Bryce Hendrix</dc:creator>
		
		<guid isPermaLink="false">http://blog.enthought.com/?p=449</guid>
		<description><![CDATA[A couple of years ago I worked on a project which needed to transport a large dataset over the wire. I looked at a number of technologies, and Google Protocol Buffers looked very interesting. Over the past week, I&#8217;ve been asked about my experience a couple of times, so I hope this provides a little [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of years ago I worked on a project which needed to transport a large dataset over the wire. I looked at a number of technologies, and Google Protocol Buffers looked very interesting. Over the past week, I&#8217;ve been asked about my experience a couple of times, so I hope this provides a little bit of insight into how to use Protocol Buffers in Python when performance matters.</p>
<p>I wrote a little test case to model the serialization of the data I wanted to send, a list of 100 pairs of arrays, where each array contained 250,000 elements. The raw data size was <strong>381 MB</strong>.</p>
<p>First, I ran the pure python test: the write took <strong>83 seconds</strong>, the read took <strong>202 seconds</strong>. Not good.</p>
<p>Next I tested the same data in C++: the write took <strong>4.4 seconds</strong> and the read took <strong>2.8 seconds</strong>. Impressive.</p>
<p>The obvious path then was to write the serialization code in C++ and expose it through an extension point. The read function, including putting all of the data into numpy arrays now takes <strong>7.5 seconds</strong>. I only needed the read function from Python, but the write function should take about the same time.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.enthought.com/?feed=rss2&amp;p=449</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Travis Oliphant announces&#8230;</title>
		<link>http://blog.enthought.com/?p=432</link>
		<comments>http://blog.enthought.com/?p=432#comments</comments>
		<pubDate>Thu, 01 Jul 2010 20:58:20 +0000</pubDate>
		<dc:creator>amenity@enthought.com</dc:creator>
		
		<guid isPermaLink="false">http://blog.enthought.com/?p=432</guid>
		<description><![CDATA[Travis Oliphant kicked off today&#8217;s SciPy 2010 Day 2 with a great keynote talk. He told the story of his own path to Python, filling his slides with the faces and work of other developers, scientists, and mathematicians — inspiration, teachers, and collaborators. He explained how his academic trajectory, from electrical engineering, through a brief [...]]]></description>
			<content:encoded><![CDATA[<p><div class="wp-caption alignnone" style="width: 510px"><a href="http://farm5.static.flickr.com/4119/4752318542_48399a5d20.jpg"><img alt="Travis announces project to extend NumPy/SciPy to .Net" src="http://farm5.static.flickr.com/4119/4752318542_48399a5d20.jpg" title="NumPy/SciPy to .Net" width="500" height="375" /></a><p class="wp-caption-text">Travis announces project to extend NumPy/SciPy to .Net</p></div> Travis Oliphant kicked off today&#8217;s SciPy 2010 Day 2 with a great keynote talk. He told the story of his own path to Python, filling his slides with the faces and work of other developers, scientists, and mathematicians —  inspiration, teachers, and collaborators. He explained how his academic trajectory, from electrical engineering, through a brief affair with neuroscience, to a biomedical engineering PhD, both drove and competed with his work creating NumPy.<br />
Last, but not least, Travis closed his talk with rather large announcement: Enthought has undertaken the extension of NumPy and SciPy to the .NET framework. For details on the project refer to the <a href="http://www.enthought.com/media/SciPyNumPyDotNet.pdf">official release</a>.  </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.enthought.com/?feed=rss2&amp;p=432</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SciPy 2010 underway!</title>
		<link>http://blog.enthought.com/?p=434</link>
		<comments>http://blog.enthought.com/?p=434#comments</comments>
		<pubDate>Thu, 01 Jul 2010 20:28:16 +0000</pubDate>
		<dc:creator>amenity@enthought.com</dc:creator>
		
		<guid isPermaLink="false">http://blog.enthought.com/?p=434</guid>
		<description><![CDATA[We were thrilled to host SciPy 2010 in Austin this year. Everyone seems to be enjoying the cool weather (so what if it’s borne of thunderstorms?) and the plush conference center/hotel (even if we had to retrain their A/V team). After two days of immensely informative Tutorials, the General Session began yesterday with speaker Dave [...]]]></description>
			<content:encoded><![CDATA[<p><div class="wp-caption alignnone" style="width: 510px"><a href="http://www.flickr.com/photos/irees/4750743647/"><img alt="Everyone minus Ian, the most valiant photographer!" src="http://farm5.static.flickr.com/4140/4750743647_3799ee6068.jpg" title="SciPy 2010" width="500" height="332" /></a><p class="wp-caption-text">Everyone minus Ian, the most valiant photographer!</p></div>We were thrilled to host SciPy 2010 in Austin this year. Everyone seems to be enjoying the cool weather (so what if it’s borne of thunderstorms?) and the plush conference center/hotel (even if we had to retrain their A/V team).<br />
After two days of immensely informative <a href="https://conference.scipy.org/scipy2010/tutorials.html">Tutorials</a>, the General Session began yesterday with speaker <a href="http://www.dabeaz.com/">Dave Beazley&#8217;s</a> awesome keynote on Python concurrency. In addition to the solid line-up of talks at the main conference, we had two very well-attended specialized tracks: <a href="http://www.delltechcenter.com/page/And+now+for+something+completely+different…++Enthought+Python’s+Flying+Circus">Glen Otero</a>, chaired the Bioinformatics track, while <a href="http://briangranger.blogspot.com/">Brian Granger</a> and <a href="http://www.picloud.com/">Ken Elkabany</a> coordinated the Parallel Processing &#038; Cloud Computing talks. The day then closed with a conference reception and guacamole-fueled Birds of a Feather sessions.<br />
<a href="http://www.flickr.com/photos/irees/4751294178/" title="SciPy 2010 by wools, on Flickr"><img src="http://farm5.static.flickr.com/4139/4751294178_f8e4049bc4.jpg" width="500" height="332" alt="SciPy 2010"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.enthought.com/?feed=rss2&amp;p=434</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>When a Spring is not a spring</title>
		<link>http://blog.enthought.com/?p=417</link>
		<comments>http://blog.enthought.com/?p=417#comments</comments>
		<pubDate>Mon, 29 Mar 2010 21:39:04 +0000</pubDate>
		<dc:creator>Bryce Hendrix</dc:creator>
		
		<guid isPermaLink="false">http://blog.enthought.com/?p=417</guid>
		<description><![CDATA[TraitsUI has a lot of layout magic, which is usually good enough, but sometimes you need to apply a little extra effort to get your GUI layout correct. One trick I often employ is to use springs between Items to align them. That works most of the time, but on occasion I need a fixed [...]]]></description>
			<content:encoded><![CDATA[<p>TraitsUI has a lot of layout magic, which is usually good enough, but sometimes you need to apply a little extra effort to get your GUI layout correct. One trick I often employ is to use springs between Items to align them. That works most of the time, but on occasion I need a fixed width spacer.</p>
<p>Lets look at the spring code:</p>
<pre class="brush: python">
class Spring ( Item ):
    # An item that is a layout &quot;spring&quot;.

    # Name of the trait the item is editing
    name = &#039;spring&#039;

    # Should a label be displayed?
    show_label = Bool( False )

    # Editor to use for the item
    editor = Instance( &#039;enthought.traits.ui.api.NullEditor&#039;, () )

    # Should the item use extra space along its Group&#039;s
    # layout orientation?
    springy = True

spring = Spring()
</pre>
<p>So what would happen if we tried to create a Spring with the width set and springy disabled? We get a fixed width spacer!</p>
<pre class="brush: python">
from enthought.traits.api import HasTraits, Int
from enthought.traits.ui.api import View, Item, VGroup, HGroup, \
     Spring, spring

class ExampleView(HasTraits):
    a = Int
    b = Int

    def trait_view(self, parent=None):
       regular_group = HGroup(
                         HGroup(Item(&#039;a&#039;),
                                show_border=True),
                         HGroup(Item(&#039;b&#039;),
                                show_border=True),
                         show_border=True,
                         label=&#039;regular&#039;)

       flex_group = HGroup(
                       HGroup(Item(&#039;a&#039;),
                              show_border=True),
                       spring,
                       HGroup(Item(&#039;b&#039;),
                              show_border=True),
                       show_border=True,
                       label=&#039;flexible&#039;)

       fixed_group = HGroup(
                       HGroup(Item(&#039;a&#039;),
                              show_border=True),
                       Spring(width=200, springy=False),
                       HGroup(Item(&#039;b&#039;),
                              show_border=True),
                       show_border=True,
                       label=&#039;fixed&#039;)

       return View(VGroup(regular_group,
                          flex_group,
                          fixed_group),
                   resizable=True)

ExampleView().configure_traits()
</pre>
<p><img src="http://blog.enthought.com/wp-content/uploads/2010/03/spring_example.png" alt="spring_example" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.enthought.com/?feed=rss2&amp;p=417</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Simplified creation of NumPy arrays from pre-allocated memory.</title>
		<link>http://blog.enthought.com/?p=410</link>
		<comments>http://blog.enthought.com/?p=410#comments</comments>
		<pubDate>Mon, 22 Mar 2010 23:56:54 +0000</pubDate>
		<dc:creator>Travis Oliphant</dc:creator>
		
		<guid isPermaLink="false">http://blog.enthought.com/?p=410</guid>
		<description><![CDATA[About 18 months ago, I wrote a blog-post that illustrates how to create a NumPy array that refers to another block of pre-allocated memory by creating a small low-level Python object that wraps around the memory and correctly deallocates the memory once NumPy is done with it. The basic idea was to create a new [...]]]></description>
			<content:encoded><![CDATA[<p>About 18 months ago, I wrote a <a href="http://blog.enthought.com/?p=62">blog-post</a> that illustrates how to create a NumPy array that refers to another block of pre-allocated memory by creating a small low-level Python object that wraps around the memory and correctly deallocates the memory once NumPy is done with it. </p>
<p>The basic idea was to create a new Python object in C and point the base member of the NumPy array structure to this newly created object after using PyArray_SimpleNewFromData to create the array from a block of pre-allocated memory.  NumPy will decref the object pointed to by its base member when it is destroyed.    The example I provided created a new Python object in C and pointed the base member to it.   That way, when the NumPy array is destroyed, the tp_dealloc function will be called on the newly created object.  </p>
<p>The solution I provided is very flexible and also illustrates how to create a new Python object in C.  However, as Lisandro Dalcin pointed out in the comments to that post, there is a simpler way to do it if you just need to call a particular deallocation function to free the underlying memory (or decrease a reference) after the NumPy array is destroyed.  </p>
<p>The simple solution is to use a low-level Python object that holds a pointer to anything as well as a destructor.   This low-level object is called a <a href="http://docs.python.org/c-api/cobject.html">CObject</a> in Python 2.x.  The equivalent in Python 3.x (backported to Python 2.7) is the <a href="http://docs.python.org/py3k/c-api/capsule.html">Capsule</a> object. </p>
<p>Creating a CObject in C code is very simple.  You just call PyCObject_FromVoidPtr with an arbitrary pointer as the first argument and a destructor function as the second argument.  The signature of this destructor function should take the arbitrary pointer as its only argument and return nothing.    The Python Object returned can be assigned to the base member of the ndarray directly.  </p>
<p>Using the CObject removes the need to create your own &#8220;dummy&#8221; Python Object just to handle calling some needed code after NumPy is done with the memory.  Thus, the code example can be updated to just: </p>
<pre class="brush: c++">
int nd=2;
npy_intp dims[2]={10,20};
size_t size;
PyObject arr=NULL;
void *mymem;

size = PyArray_MultiplyList(dims, nd);
mymem = _aligned_malloc(size, 16);
arr = PyArray_SimpleNewFromData(nd, dims, NPY_DOUBLE, mymem);
if (arr == NULL) {
    _aligned_free(mymem);
    Py_XDECREF(arr);
}
PyArray_BASE(arr) = PyCObject_FromVoidPtr(mymem, _aligned_free);
</pre>
<p>For completeness, the original code containing the _aligned_malloc and<br />
_aligned_free function calls is reproduced here: </p>
<pre class="brush: c++">
#include &lt;errno.h&gt;
#define uintptr_t size_t

#define _NOT_POWER_OF_TWO(n) (((n) &amp; ((n) - 1)))
#define _UI(p) ((uintptr_t) (p))
#define _CP(p) ((char *) p)

#define _PTR_ALIGN(p0, alignment)			\
((void *) (((_UI(p0) + (alignment + sizeof(void*)))	\
&amp; (~_UI(alignment - 1)))))

/* pointer must sometimes be aligned; assume sizeof(void*) is a power of two */
#define _ORIG_PTR(p) (*(((void **) (_UI(p) &amp; (~_UI(sizeof(void*) - 1)))) - 1))

static void *_aligned_malloc(size_t size, size_t alignment) {
    void *p0, *p;

    if (_NOT_POWER_OF_TWO(alignment)) {
        errno = EINVAL;
        return ((void *) 0);
    }

    if (size == 0) {
        return ((void *) 0);
    }
    if (alignment &lt; sizeof(void *)) {
        alignment = sizeof(void *);
    }

    /* including the extra sizeof(void*) is overkill on a 32-bit
       machine, since malloc is already 8-byte aligned, as long
       as we enforce alignment &gt;= 8 ...but oh well */
    p0 = malloc(size + (alignment + sizeof(void *)));
    if (!p0) {
        return ((void *) 0);
    }
    p = _PTR_ALIGN(p0, alignment);
    _ORIG_PTR(p) = p0;
    return p;
}

static void _aligned_free(void *memblock) {
    if (memblock) {
        free(_ORIG_PTR(memblock));
    }
}
</pre>
<p>Thanks to Lisandro for pointing out this simplified approach.   </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.enthought.com/?feed=rss2&amp;p=410</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EPD 6.1: MKL on Linux, Windows, &amp; OSX</title>
		<link>http://blog.enthought.com/?p=386</link>
		<comments>http://blog.enthought.com/?p=386#comments</comments>
		<pubDate>Tue, 02 Mar 2010 12:00:11 +0000</pubDate>
		<dc:creator>amenity@enthought.com</dc:creator>
		
		<guid isPermaLink="false">http://blog.enthought.com/?p=386</guid>
		<description><![CDATA[There were several reasons we initially decided to include MKL, an extensively threaded, highly optimized library, in the Enthought Python Distribution. For one thing, we like that MKL detects the processing capability of the machine and then runs optimal algorithm for that hardware. Secondly, we knew that MKL would offer faster linear algebra routines than [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.enthought.com/products/epd.php"><img src="http://blog.enthought.com/wp-content/uploads/2010/03/epd-6-1-long.jpg" alt="epd-6-1-long" title="epd-6-1-long" width="487" class="aligncenter size-full wp-image-391" /></a><br />
There were several reasons we initially decided to include <a href="http://software.intel.com/en-us/intel-mkl/">MKL</a>, an extensively threaded, highly optimized library, in the <a href="http://www.enthought.com/products/epd.php">Enthought Python Distribution</a>. For one thing, we like that MKL detects the processing capability of the machine and then runs optimal algorithm for that hardware. Secondly, we knew that MKL would offer faster linear algebra routines than the ATLAS framework, previously used for EPD Linux and Windows, and Accelerate library, previously used for OSX.</p>
<p>We didn&#8217;t anticipate, however, just how dramatic that speed up would be.  Our <a href="http://www.enthought.com/epd/mkl/">benchmarking tests</a> document the astounding increases in processing speed that MKL lends to EPD.<br />
<a href="http://www.enthought.com/epd/mkl/"><img alt="" src="http://www.enthought.com/img/MKLonLinux.jpg" title="MKL on Linux" class="aligncenter" width="487" /></a></p>
<p>In EPD 6.1, <a href="http://numpy.scipy.org">NumPy</a> and <a href="http://scipy.org">SciPy</a> are dynamically linked against the MKL linear algebra routines.  This allows EPD users to seamlessly benefit from the highly optimized BLAS and LAPACK routines in the MKL.  In addition, EPD 6.1 comes bundled with all of the MKL run-time libraries so that advanced users can take advantage (with ctypes) of even more of the MKL library such as fast Fourier transforms, trust-region optimization methods, sparse solvers, and vector math. </p>
<p>We&#8217;re really pleased with the optimizations MKL offers to our EPD users. <a href="http://enthought.com/products/getepd.php">Try out EPD 6.1 for yourself</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.enthought.com/?feed=rss2&amp;p=386</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>PyCon 2010 Report</title>
		<link>http://blog.enthought.com/?p=372</link>
		<comments>http://blog.enthought.com/?p=372#comments</comments>
		<pubDate>Tue, 23 Feb 2010 15:53:01 +0000</pubDate>
		<dc:creator>Corran Webster</dc:creator>
		
		<guid isPermaLink="false">http://blog.enthought.com/?p=372</guid>
		<description><![CDATA[I just got back from PyCon, where I gave my tutorial on Traits, met all sorts of smart and interesting people, listened to some great talks, ate more food than I probably should have, and got less sleep than I probably needed.  It was really nice to see talks and posters about things that people [...]]]></description>
			<content:encoded><![CDATA[<p>I just got back from PyCon, where I gave my tutorial on Traits, met all sorts of smart and interesting people, listened to some great talks, ate more food than I probably should have, and got less sleep than I probably needed.  It was really nice to see talks and posters about things that people are doing with Python in science at a general-purpose conference.</p>
<p>Highlights for me:<br />
• <a href="http://www.dabeaz.com/">Dave Beazley&#8217;s</a> awesome talk on <a href="http://www.dabeaz.com/python/UnderstandingGIL.pdf">Python&#8217;s Global Interpreter Lock (GIL)</a> and its curious behaviour.  If you do any programming with threads in Python you have to make sure that you watch the <a href="http://pycon.blip.tv/file/3254256/">video</a> — it&#8217;s a clear, understandable and unflinching look at some of the weird behaviour that you can get from CPU-bound threads in Python.  The take-home message of his talk for scientific programmers: With current versions of Python, there is little point of running intensive pure-Python computations in parallel using threads — and doing so on multiple core machines may severely degrade computation time.  Dave showed a simple example where a computation split into two threads on two cores took twice as long as the same computation in one thread on one core.  Fortunately NumPy releases the GIL for most of its operations, but his talk highlights something that we should all keep in mind.</p>
<p>• Wes McKinney&#8217;s new <a href="http://code.google.com/p/pandas/">Pandas</a> package for data series analysis.  I didn&#8217;t get to see his talk, but I got to spend a fair amount of time talking to Wes and his package was generating quite a bit of buzz in the financial and numerical computing open spaces.  It&#8217;s an early release, but there have been several projects I&#8217;ve been involved in over the past couple of years where the Pandas data structures would have been invaluable.  I&#8217;m looking forward to being able to use it in the future in projects that I&#8217;m working on.</p>
<p>Altogether, a great time.  Thanks to everyone who dropped by the Enthought booth and talked with us, and we&#8217;ll see you in Atlanta at PyCon 2011 next year!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.enthought.com/?feed=rss2&amp;p=372</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PyCon Giveaway Winners Announced</title>
		<link>http://blog.enthought.com/?p=367</link>
		<comments>http://blog.enthought.com/?p=367#comments</comments>
		<pubDate>Mon, 22 Feb 2010 18:28:19 +0000</pubDate>
		<dc:creator>amenity@enthought.com</dc:creator>
		
		<guid isPermaLink="false">http://blog.enthought.com/?p=367</guid>
		<description><![CDATA[Corran, Ilan, and Travis had a great time at PyCon 2010 in Atlanta. We collected names for two drawings at our booth and just drew the winners this morning. Joseph Tennies, from Esterline, won the seat at an Enthought Open Training Course. Meanwhile, Basic subscriptions will go out to: Jason Zillioux R. Mark Sharp, Southwest [...]]]></description>
			<content:encoded><![CDATA[<p>Corran, Ilan, and Travis had a great time at PyCon 2010 in Atlanta. We collected names for two drawings at our booth and just drew the winners this morning.  Joseph Tennies, from Esterline, won the seat at an <a href="http://www.enthought.com/training/open-courses.php">Enthought Open Training Course</a>. </p>
<p>Meanwhile, <a href="http://www.enthought.com/products/getepd.php">Basic subscriptions</a> will go out to:</p>
<ul>
<li>Jason Zillioux</li>
<li>R. Mark Sharp, Southwest Foundation for Biomedical Research</li>
<li>Piotr Adam Zolnierczuk, Oak Ridge National Lab</li>
<li>Daniel Schep, Savannah River National Lab</li>
</ul>
<p>Congratulations to all the winners!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.enthought.com/?feed=rss2&amp;p=367</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Save the Date: SciPy 2010, June 28-July 3</title>
		<link>http://blog.enthought.com/?p=349</link>
		<comments>http://blog.enthought.com/?p=349#comments</comments>
		<pubDate>Thu, 11 Feb 2010 22:06:22 +0000</pubDate>
		<dc:creator>amenity@enthought.com</dc:creator>
		
		<guid isPermaLink="false">http://blog.enthought.com/?p=349</guid>
		<description><![CDATA[The annual US Scientific Computing with Python Conference, SciPy, has been held at Caltech since it began in 2001. While we always love an excuse to go to California, it&#8217;s also important to make sure that we allow everyone an opportunity to attend the conference. So, as Jarrod announced last fall, we&#8217;ll begin rotating the [...]]]></description>
			<content:encoded><![CDATA[<p>The annual US Scientific Computing with Python Conference, SciPy, has been held at <a href="http://www.caltech.edu/">Caltech</a> since it began in 2001. While we always love an excuse to go to California, it&#8217;s also important to make sure that we allow everyone an opportunity to attend the conference. So, <a href="http://blog.jarrodmillman.com/2009/11/scipy-2010-coming-to-austin-tx-628-74.html">as Jarrod announced</a> last fall, we&#8217;ll begin rotating the conference location and hold the <a href="http://conference.scipy.org/scipy2010/">2010 conference</a> in Austin, Texas.</p>
<p><a href="http://conference.scipy.org/scipy2010"><img alt="" src="http://conference.scipy.org/scipy2010/img/att.jpg" title="AT&#038;T conference center" class="aligncenter" width="460" height="306" /></a></p>
<p>As you may know, Enthought is headquartered in Austin. So in addition to our standard SciPy sponsorship, this year we&#8217;ll also be undertaking a great deal of the planning and organization. </p>
<p>To begin with, we&#8217;re thrilled to announce that we&#8217;ve secured several corporate sponsorships that will allow us to host the conference at the brand new <a href="http://conference.scipy.org/scipy2010/location.html">AT&#038;T Executive Education and Conference Center</a> on campus at the <a href="http://www.utexas.edu/">University of Texas</a>. It&#8217;s a wonderful facility in Central Austin and provides easy access to an array of great <a href="http://conference.scipy.org/scipy2010/location.html">restaurants, parks, and music venues</a>. </p>
<p>We will also be able to provide stipends for our <a href="http://conference.scipy.org/scipy2010/tutorials.html">Tutorial presenters</a> for the first time. These community members provide us with an invaluable learning experience every year, and we&#8217;re very excited to be able to compensate them for their efforts. And of course, we&#8217;ll also continue to offer  <a href="http://conference.scipy.org/scipy2010/student.html">student sponsorships</a> to support active academic contributors who want to attend the conference. </p>
<p>So mark your calendars, folks! June 28 &#8211; July 3. <a href="https://conference.scipy.org/scipy2010/registration.html">Early registration</a> open now. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.enthought.com/?feed=rss2&amp;p=349</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
