Вы хотите модуль даты и времени.
>>> from datetime import datetime, timedelta
>>> datetime(2008,08,18) - datetime(2008,09,26)
datetime.timedelta(4)
Или другой пример:
Python 2.5.2 (r252:60911, Feb 22 2008, 07:57:53)
[GCC 4.0.1 (Apple Computer, Inc. build 5363)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> today = datetime.date.today()
>>> print today
2008-09-01
>>> last_year = datetime.date(2007, 9, 1)
>>> print today - last_year
366 days, 0:00:00
, Как указано здесь
Эта страница предоставляет некоторую помощь по оптимизации производительности: http://developer.apple.com/documentation/Cocoa/Conceptual/CoreData/Articles/cdPerformance.html#//apple_ref/doc/uid/TP40003468-SW1
Хотя это не очень эффективно, почему бы просто не создать их в памяти с помощью NSDictionary? Прочтите все из Core Data в NSDictionary, затем объедините свои данные, заменив все в Core Data.
У меня все это работает очень хорошо благодаря Норману, который направил меня на правильный путь. Я отправлю здесь свой вспомогательный класс для других.
В основном, мой вспомогательный класс будет искать, существует ли NSManagedObject для некоторого идентификатора, и может создать его для некоторого идентификатора. Это выполняется для меня достаточно быстро: 1000 операций поиска / создания занимают около 2 секунд на моем iPhone (я также сделал несколько других вещей, чистый поиск / создание, вероятно, быстрее).
Он делает это путем кеширования словаря всех NSManagedObjects и проверки этого кеша, а не выполнения нового NSFetchRequest.
Пара модификаций, которые могут еще больше ускорить процесс: 1. Получить только выбранные свойства для NSManagedObjects 2. Получить в словарь только свойство идентификатора для NSManagedObject, а не весь объект. В моем тестировании производительности одиночный запрос не был медленной частью (но с 1000 элементами я ожидал, что он будет быстрым). Самой медленной частью было создание элементов.
#import "CoreDataUniquer.h"
@implementation CoreDataUniquer
//the identifying property is the field on the NSManagedObject that will be used to look up our custom identifier
-(id)initWithEntityName:(NSString*)newEntityName andIdentifyingProperty:(NSString*)newIdProp
{
self = [super init];
if (self != nil) {
entityName = [newEntityName retain];
identifyingProperty = [newIdProp retain];
}
return self;
}
-(NSManagedObject*)findObjectForID:(NSString*)identifier
{
if(identifier == nil)
{
return nil;
}
if(!objectList)
{
NSManagedObjectContext *moc = [(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription
entityForName:entityName inManagedObjectContext:moc];
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:entityDescription];
NSError *error;
NSArray *array = [moc executeFetchRequest:request error:&error];
objectList = [[NSMutableDictionary dictionary] retain];
for (NSManagedObject* p in array) {
NSString* itemId = [p valueForKey:identifyingProperty];
[objectList setObject:p forKey:itemId];
}
}
NSManagedObject* returnedObject = [objectList objectForKey:identifier];
return returnedObject;
}
-(NSManagedObject*)createObjectForID:(NSString*)identifier
{
NSManagedObject* returnedObject = [NSEntityDescription
insertNewObjectForEntityForName:entityName
inManagedObjectContext:[(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext]];
[returnedObject setValue:identifier forKey:identifyingProperty];
[objectList setObject:returnedObject forKey:identifier];
return returnedObject;
}
- (void) dealloc
{
DESTROY(entityName);
DESTROY(identifyingProperty);
[super dealloc];
}
@end